本文小編為大家詳細(xì)介紹“python爬蟲利器scrapy怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“python爬蟲利器scrapy怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
為江西等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及江西網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、江西網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
Scrapy是用純Python實(shí)現(xiàn)一個(gè)為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架,用途非常廣泛。
Scrapy 使用了 Twisted(其主要對手是Tornado)異步網(wǎng)絡(luò)框架來處理網(wǎng)絡(luò)通訊,可以加快我們的下載速度,不用自己去實(shí)現(xiàn)異步框架,并且包含了各種中間件接口,可以靈活的完成各種需求。
Scrapy Engine(引擎): 負(fù)責(zé)Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數(shù)據(jù)傳遞等。
Scheduler(調(diào)度器): 它負(fù)責(zé)接受引擎發(fā)送過來的Request請求,并按照一定的方式進(jìn)行整理排列,入隊(duì),當(dāng)引擎需要時(shí),交還給引擎。
Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,
Spider(爬蟲):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入Scheduler(調(diào)度器),
Item Pipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析、過濾、存儲(chǔ)等)的地方.
Downloader Middlewares(下載中間件):你可以當(dāng)作是一個(gè)可以自定義擴(kuò)展下載功能的組件。
Spider Middlewares(Spider中間件):你可以理解為是一個(gè)可以自定擴(kuò)展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests)
開發(fā)一個(gè)簡單爬蟲步驟:
新建項(xiàng)目
scrapy startproject demo
編寫spider
種子url (請求)
解析方法
編寫item
結(jié)果數(shù)據(jù)模型
持久化
編寫pipelines
scrapy.cfg :項(xiàng)目的配置文件 mySpider/ :項(xiàng)目的Python模塊,將會(huì)從這里引用代碼 mySpider/items.py :項(xiàng)目的目標(biāo)文件 mySpider/pipelines.py :項(xiàng)目的管道文件 mySpider/settings.py :項(xiàng)目的設(shè)置文件 mySpider/spiders/ :存儲(chǔ)爬蟲代碼目錄
scrapy genspider gitee "gitee.com"
通常我們解析都會(huì)涉及到 xpath csspath 正則,有的時(shí)候可能還有jsonpath(python中json訪問基本不用使用復(fù)雜的jsonpath,字典訪問就可以)
scrapy 內(nèi)置xpath和csspath支持
而解析器本身也可以單獨(dú)使用
xpath()
extract_first()
extract() #返回一個(gè)列表
索引訪問,因?yàn)閟crapy.selector.unified.SelectorList繼承l(wèi)ist,可以通過索引訪問
from scrapy import Selector if __name__ == '__main__': body = """Title hello
hello
""" s = Selector(text=body) title=s.xpath("http://title/text()").extract_first();#抽取 print(title) #Title pe = s.xpath("http://p") print(s.xpath("http://p").extract()) #['hello
', 'hello
'] print(pe) #[hello'>, hello'>] print(type(pe)) # print(type(pe[0])) #通過索引訪問 # print(type(pe.pop())) # p=s.xpath("http://p").extract_first() print(p)
css()
css選擇器我們::text選擇內(nèi)容,用::attr() 選擇屬性
print(s.css("title").extract_first()) print(s.css("title::text").extract_first()) print(s.css("title::text").extract()) print(s.css("p.big::text").extract_first()) print(s.css("p.big::attr(class)").extract_first()) #Title # Title # ['Title'] # hello big # big
css()和xpath()混用scrapy.selector.unified.SelectorList
scrapy.selector.unified.Selector
本身有css和xpath方法,所以可以組合使用
print(s.xpath("http://body").css("p.big").extract_first()) print(s.css("body").xpath("http://p[@class='big']").extract_first()) #hello big
#hello big
re()和re_first()scrapy.selector.unified.SelectorList
scrapy.selector.unified.Selector
擁有 re()
方法,支持通過正則來過濾
print(s.xpath("http://p/text()").re_first("big")) print(type(s.xpath("http://p/text()").re("big"))) # big #
** 但re()返回列表,.re_first返回str,所以不能再繼續(xù)調(diào)用其他的選擇方法
response對象已經(jīng)
class GiteeSpider(scrapy.Spider): name = 'gitee' allowed_domains = ['gitee.com'] start_urls = ['https://gitee.com/haimama'] def parse(self, response): print(type(response)) t=response.xpath("http://title/text()").extract_first() print(t) ##啟動(dòng)爬蟲執(zhí)行后的結(jié)果 # 執(zhí)行結(jié)果省略日志 ## 碼馬 (haimama) - Gitee
response對象類型為 scrapy.http.response.html.HtmlResponse
,該類繼承TextResponse
。擁有xpath()和css()方法如下
所以response 可以直接使用前文中的Selector 的方式來解析
def xpath(self, query, **kwargs): return self.selector.xpath(query, **kwargs) def css(self, query): return self.selector.css(query)
settings.py是爬蟲的配置文件,要正常啟動(dòng)爬蟲的話,一定注意將robo協(xié)議限制 修改為 ROBOTSTXT_OBEY = False
其他相關(guān)配置,我們下節(jié)再介紹
在爬蟲目錄編寫run.py方法,添加如下腳本,這樣就可以直接執(zhí)行爬蟲了。如果命令行執(zhí)行的話scrapy crawl gitee
。其中g(shù)itee為爬蟲名,對應(yīng)GiteeSpider
中的name
字段
# coding: utf-8 from scrapy import cmdline if __name__ == '__main__': cmdline.execute("scrapy crawl gitee".split()) # scrapy crawl gitee
讀到這里,這篇“python爬蟲利器scrapy怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。