Python爬蟲第九天:crawl spider|日志|代理|數(shù)據(jù)存儲(chǔ)

內(nèi)容簡述:? ? ?? ??

? ??一:Crawl Spider? ? ? ? ?

? ??二:日志? ? ? ? ?

? ??三:Request和Response總結(jié)

? ? 四:代理

? ? 五:Scrapy實(shí)現(xiàn)模擬登錄

? ? 六:數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫mysql中

一:crawl spider

? ? ?CrawlSpider是一個(gè)類,父類是scrapy.Spider。

????CrawlSpider不僅有Spider的功能,還有自己獨(dú)特功能

特有功能:CrawlSpider可以定義規(guī)則,解析html時(shí)可根據(jù)鏈接規(guī)則提取出指定鏈接,然后再向這些鏈接發(fā)送請求。

通常用于:如果有需要跟進(jìn)鏈接的需求,爬取網(wǎng)頁之后,需要提取鏈接再次爬取。

如何提取鏈接?

??????? 鏈接提取器,在這里就可以寫規(guī)則提取指定鏈接

??????? scrapy.linkextractors.LinkExtractor(

?? ??? ??? allow = (),???#正則表達(dá)式? ?????? 提取符合正則的鏈接

?? ??? ??? deny = (),???? # (不用)正則表達(dá)式? 不提取符合正則的鏈接

?? ?? ???? allow_domains = (),? #(不用)允許的域名

?? ??? ??? deny_domains = (),?? #(不用)不允許的域名

?? ??? ??? restrict_xpaths = (), # xpath,提取符合xpath規(guī)則的鏈接

?? ??? ??? retrict_css = ()?#提取符合選擇器規(guī)則的鏈接)

案例】:電影天堂-提取所有頁碼鏈接

scrapy shellhttp://www.dytt8.net/html/gndy/dyzz/index.html

????????????????????from scrapy.linkextractorsimport LinkExtractor

正則用法

??????????????????? links1 = LinkExtractor(allow='list_23_\d+\.html')

?????????????????? links1.extract_links(response) 查看提取到的所有鏈接

??xpath用法

??????? ????????????links2 =LinkExtractor(restrict_xpaths='//div[@class="x"]')

? ? ? ? ? ? ? ? ? ?【注意】這里的xpath不帶a

? ? ??css用法

????????????????? links3 = LinkExtractor(restrict_css='.x')【注意】這里的選擇器不帶a

案例】:讀書網(wǎng)-散文隨筆

https://www.dushu.com/book/1163.html

????????? ????????scrapy startproject readbook1

scrapy genspider -t crawl readbookwww.dushu.com

crawlspider運(yùn)行原理:

【實(shí)操-spiders注意說明】

????????rules =(Rule(LinkExtractor(allow=r'/book/1163_\d+\.html'), callback='parse_item',follow=False),)

?? ??? 【注1】callback只能寫函數(shù)名字符串, callback='parse_item'

?? ??? 【注2】在基本的spider中,如果重新發(fā)送請求,那里的callback寫的是?? callback=self.parse_item

二:日志信息和日志等級

????? 級別:

??????? CRITICAL:嚴(yán)重錯(cuò)誤

??????? ERROR:一般錯(cuò)誤

??????? WARNING:警告

??????? INFO:一般信息

??????? DEBUG:調(diào)試信息

??????? 默認(rèn)的級別為DEBUG,會(huì)顯示上面所有的信息

??????? 在配置文件中?settings.py設(shè)置

LOG_LEVEL:設(shè)置日志顯示等級,此舉動(dòng)決定了顯示哪些,不顯示哪些

LOG_FILE:將屏幕顯示的信息記錄到文件中,屏幕不再顯示

三:Request和response總結(jié)

????? Request(類)

get請求

scrapy.Request(url=url,callback=self.parse_item,meta={'item':item},headers=headers)

??????? url:要請求的地址

??????? callback:響應(yīng)成功之后的回調(diào)函數(shù)

??????? meta:參數(shù)傳遞

??????? headers:定制頭信息,一般不用

????? response(對象)

??????? response.text:字符串格式文本

??????? response.body:二進(jìn)制格式文本

??????? response.url:當(dāng)前響應(yīng)的url地址

??????? response.status:狀態(tài)碼

??????? response.xpath():篩選想要的數(shù)據(jù)

??????? response.css(): 篩選想要的數(shù)據(jù)

post請求

????? 【溫馨提示】

如果直接發(fā)送post請求,start_urls和parse方法就用不到

因?yàn)橹貙懥藄tart_requests(self)這個(gè)方法,

案例】:百度翻譯

????? scrapy.FormRequest(url=url,headers=headers, callback=self.parse_item

, formdata=data)

??????? url:要發(fā)送的post地址

??????? headers:定制頭信息

??????? callback:回調(diào)函數(shù)

??????? formdata: post所攜帶的數(shù)據(jù)【字典】

四:代理

????? 通過下載中間件來進(jìn)行添加

????? (1)到settings.py中,打開一個(gè)選項(xiàng)

?????????? DOWNLOADER_MIDDLEWARES配置選項(xiàng)

????? (2)到middlewares.py中找到以下方法寫代碼

????? ?defprocess_request(self, request, spider):

?? ????? request.meta['proxy'] ='https://113.68.202.99:8888'

?? ???????return None

五:scrapy實(shí)現(xiàn)模擬登錄

?? 【案例】豆瓣-douban

https://accounts.douban.com/login

????? 【溫馨提示】

????????????Douban基于安全考慮-比較靠譜的網(wǎng)站,登錄時(shí)需攜帶Cookie。

所以需要首先向登錄地址發(fā)送get請求,然后再向post地址發(fā)送post請求,因?yàn)橹虚g要攜帶cookie,才能登錄成功

??????????? 請求模式【get==>post==>get】

六:存儲(chǔ)到mysql中

?? 【案例】-讀書項(xiàng)目

?????????? from scrapy.utils.project importget_project_settings

?? ????????settings = get_project_settings()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容