scrapy
scrapy是一個爬蟲框架连锯,是用python語言編寫的,如果想更加深入的了解用狱,可以嘗試著看他的源碼运怖,非常出名,非常強悍夏伊,多進程摇展、多線程、隊列等溺忧,底層都有使用
我們只需要按照人家提供的接口去實現(xiàn)即可
安裝: pip install scrapy
學(xué)習(xí)框架:
引擎吗购、spiders、調(diào)度器砸狞、下載器、管道
工作原理:
官方文檔:
http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html
簡單使用:
(1)創(chuàng)建項目
scrapy startproject firstblood
(2)認識項目結(jié)構(gòu)
firstblood
firstblood 項目文件存放地方
pycache 緩存文件
spiders 存放爬蟲文件的地方
pycache 緩存文件
init.py 包的標記
lala.py 爬蟲文件(核心代碼)(×)
init.py 包的標記
items.py 定義數(shù)據(jù)結(jié)構(gòu)的地方(×)
middlewares.py 了解(下載中間件)
pipelines.py 管道文件镀梭,處理數(shù)據(jù)(×)
settings.py 項目的配置文件(×)
scrapy.cfg 不用了解
(3)開啟項目刀森,生成爬蟲文件
cd firstblood
scrapy genspider 爬蟲名字 爬取域名
爬蟲文件里面屬性的含義
爬蟲的名字
啟動爬蟲的時候需要使用
name = 'qiubai'
允許的域名,是一個列表报账,對要爬取的url進行限制研底,限制域名
妹子圖網(wǎng)站,src和網(wǎng)站的域名不是同一個透罢,如果不注意榜晦,向圖片發(fā)送的請求就都過濾掉了
allowed_domains = ['www.qiushibaike.com', 'www.baidu.com']
起始url,是一個列表羽圃,一般只寫一個
start_urls = ['http://www.qiushibaike.com/']
這是重寫的函數(shù)乾胶,也是一個回調(diào)函數(shù),parse函數(shù)處理起始url的響應(yīng)
response就是過來的響應(yīng)對象
def parse(self, response):
(4)將項目跑起來朽寞,認識response對象
cd firstblood/firstblood/spiders
scrapy crawl qiubai
【注】修改配置文件识窿,robots協(xié)議,定制請求頭
response.text 獲取字符串格式內(nèi)容
response.body 獲取字節(jié)格式內(nèi)容
response.url 獲取請求url
response.headers 獲取響應(yīng)頭部
response.status 獲取響應(yīng)狀態(tài)碼
response.xpath()
(5)抓取糗百內(nèi)容
response.xpath() 和以前的xpath不太一樣脑融,最后要通過extract進行提取才可以
直接輸出json格式 scrapy crawl qiubai -o qiubai.json
scrapy crawl qiubai -o qiubai.xml
scrapy crawl qiubai -o qiubai.csv
【注】你導(dǎo)出的時候有空行喻频,網(wǎng)上搜一下即可解決
【注】亂碼,你使用office打開肘迎,gbk甥温,utf8锻煌,右鍵另存為,選字符集姻蚓,在打開即可
scrapy shell
是什麼宋梧?scrapy的調(diào)試工具,通過xpath來提取數(shù)據(jù)的時候史简,如果直接寫到代碼中乃秀,在調(diào)試的時候不太方便,我們可以通過scrapy shell先進行調(diào)試圆兵,調(diào)試完之后跺讯,將xpath路徑拷貝過去即可
依賴一個庫:ipython
pip install ipython
ipython是一個更加智能的python交互環(huán)境
scrapy shell url
- 如果進ipython環(huán)境失敗,那就需要到工程目錄下進行調(diào)試
- 進來之后response即可使用
response.text 字符串格式內(nèi)容
response.body 字節(jié)格式內(nèi)容
response.xpath()
谷歌瀏覽器自動生成xpath殉农,右鍵刀脏,copy==》copy xpath
/html/body/div[3]/div[4]/div[1]/div/div[2]/ul/li[1]/div[1]/div/a/img
/html/body/div[3]/div[4]/div[1]/div/div[2]/ul/li[1]/div[1]/a
ret[0].extract() === ret.extract()[0] == ret.extract_first()
【注】如果xpath寫錯了,前兩個會直接報錯超凳,extract_first會返回None
response.css(),
就是以前學(xué)習(xí)的select方法愈污,里面寫選擇器
body > div.page > div.page-body.clearfix > div.main > div > div.b > ul > li:nth-child(1) > div.cont-list-head > div > a > img
selector對象:
scrapy里面自己封裝的對象,這種對象提取的時候就得extract()
獲取img標簽的data-src屬性轮傍,當然最后還得extract()
ret = response.css('.cont-item > .cont-list-head img::attr(data-src)')
獲取文本內(nèi)容暂雹,當然最后都的extract一下
ret = response.css('.cont-item > .cont-list-head > a::text')
item對象
這種對象的用法和字典的用法一模一樣,而且這種對象可以快速的轉(zhuǎn)化為字典
p = Person()
p['name'] = xxx
p['age'] = xxx
d = dict(p)
2创夜、yield item和請求
yield scrapy.Request(url=url, callback=self.parse)
3杭跪、下載圖片
http://699pic.com/people.html
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
4、日志信息和等級
CRITICAL 嚴重錯誤
ERROR 一般錯誤
WARNING 警告
INFO 一般信息
DEBUG 調(diào)試信息 默認級別
發(fā)現(xiàn)bug需要3s鐘驰吓,解決bug需要3個小時涧尿,debug卻要一輩子
甲蟲 debug
# 在配置文件中設(shè)置錯誤級別,只顯示ERROR以上的錯誤
LOG_LEVEL = 'ERROR'
# 想看到所有的debug信息檬贰,但是又不想顯示到屏幕中姑廉,可以設(shè)置寫入到文件中
LOG_FILE = 'log.txt'
5、發(fā)送post請求
scrapy也可以發(fā)送post請求翁涤,啟動就發(fā)送post請求怎么做桥言?
將start_urls給注釋掉
重寫start_requests方法即可
yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse)
6、請求傳參
yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})
1迷雪、crawlspider
是什麼限书?CrawlSpider, 類名。在scrapy里面章咧,有好多爬蟲類倦西,最基本的是Spider類,基類赁严,還有一個常用的一個爬蟲類扰柠,就是CrawlSpider粉铐,該類繼承自Spider類,所以功能要比Spider要多卤档,多了一個很重要的功能蝙泼,叫做鏈接提取的功能
鏈接提取器類,通過類創(chuàng)建對象劝枣,對象的方法就能提取鏈接
from scrapy.linkextractors import LinkExtractor
LinkExtractor(
allow=xxx, # 正則表達式
restrict_xpaths=xxx, # xpath路徑汤踏,符合這個路徑的所有a鏈接提取到
restrict_css=xxx, # 選擇器,符合選擇器的所有a鏈接提取到
)
在scrapy shell中演示規(guī)則提取
(1)正則提取
lk = LinkExtractor(allow=r'/8hr/page/\d+/')
lk.extract_links(response)
(2)xpath提取
如下兩種方式都可以
lk = LinkExtractor(restrict_xpaths='//ul[@class="pagination"]/li/a')
lk = LinkExtractor(restrict_xpaths='//ul[@class="pagination"]/li')
(3)css提取
lk = LinkExtractor(restrict_css='.pagination > li > a')
lk = LinkExtractor(restrict_css='.pagination > li')
代碼中使用
犯賤網(wǎng)
圖形修改
2舔腾、存儲到mysql溪胶、mongodb
導(dǎo)入一個讀取配置文件的函數(shù)
from scrapy.utils.project import get_project_settings
通過這個函數(shù),將配置文件全部讀進來稳诚,讀進來是一個字典
settings = get_project_settings()
custom_settings = {
"ITEM_PIPELINES": {
'movieproject.pipelines.MyMongoDbPipeline': 302,
}
}
web方向 框架學(xué)習(xí)
爬蟲方向 高于web 涉及數(shù)據(jù)抓取哗脖,過濾分析,數(shù)據(jù)可視化扳还,性能要求才避,需求改變,立即修改滿足需求氨距,反爬 代理ip就可以搞定桑逝,反爬,課堂上的例子 案例
數(shù)據(jù)方向 高于前兩個
3俏让、redis配置
讓其他的電腦能夠鏈接你的redis肢娘,并且配置和修改值
修改兩個地方
第55行 #bind 127.0.0.1 注釋掉
第75行 protected-mode no yes修改為no
4、存儲到redis舆驶、分布式部署
分布式?為了提高爬取的效率而钞,讓多臺電腦一起爬取沙廉,比如一共100url,三臺電腦一起爬取臼节,一個電腦33個
scrapy寫的工程撬陵,都不能實現(xiàn)分布式,沒有這個功能
要想實現(xiàn)分布式网缝,使用一套組件 scrapy-redis 不是官方的巨税,安裝就能使用\
pip install scrapy-redis
部署
windows redis服務(wù)端 安裝redis服務(wù)器
客戶端,運行代碼的電腦
linux1
linux2
windows1
windows2
演示:
linux : redis服務(wù)端
我的windows:客戶端1
你的linux:客戶端2
你的windows:客戶端3
xxxx
查看官方例子
三個樣本文件
dmoz.py 普通的crawlspider模板
mycrawler_redis.py 如果你的爬蟲文件繼承自CrawlSpider粉臊,又想實現(xiàn)分布式草添,請參考這個模板
myspider_redis.py redisspider模板,如果你的爬蟲繼承自Spider扼仲,又想實現(xiàn)分布式远寸,請參考這個模本
分布式模板:
redis-key : 就是以前的 start_urls 這個列表
init方法: 這個就是以前的 allowed_domains 這個列表
【注】init方法不能使用抄淑,要定義動態(tài)列表,還得用以前的寫法
配置文件說明
見代碼
啟動工程
scrapy runspider xxx.py
lpush fenspider:start_urls http://699pic.com/people.html