內(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()