內(nèi)容簡述:? ? ?? ??
? ??一:Crawl Spider? ? ? ? ?
? ??二:日志? ? ? ? ?
? ??三:Request和Response總結(jié)
? ? 四:代理
? ? 五:Scrapy實現(xiàn)模擬登錄
? ? 六:數(shù)據(jù)存儲到數(shù)據(jù)庫mysql中
一:crawl spider
? ? ?CrawlSpider是一個類爆捞,父類是scrapy.Spider幼苛。
????CrawlSpider不僅有Spider的功能菜循,還有自己獨特功能
特有功能:CrawlSpider可以定義規(guī)則菠剩,解析html時可根據(jù)鏈接規(guī)則提取出指定鏈接戈抄,然后再向這些鏈接發(fā)送請求年柠。
通常用于:如果有需要跟進鏈接的需求狡相,爬取網(wǎng)頁之后梯轻,需要提取鏈接再次爬取。
如何提取鏈接尽棕?
??????? 鏈接提取器喳挑,在這里就可以寫規(guī)則提取指定鏈接
??????? scrapy.linkextractors.LinkExtractor(
?? ??? ??? allow = (),???#正則表達式? ?????? 提取符合正則的鏈接
?? ??? ??? deny = (),???? # (不用)正則表達式? 不提取符合正則的鏈接
?? ?? ???? 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運行原理:
【實操-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:嚴重錯誤
??????? ERROR:一般錯誤
??????? WARNING:警告
??????? INFO:一般信息
??????? DEBUG:調(diào)試信息
??????? 默認的級別為DEBUG,會顯示上面所有的信息
??????? 在配置文件中?settings.py設置
LOG_LEVEL:設置日志顯示等級回官,此舉動決定了顯示哪些曹宴,不顯示哪些
LOG_FILE:將屏幕顯示的信息記錄到文件中,屏幕不再顯示
三:Request和response總結(jié)
????? Request(類)
get請求
scrapy.Request(url=url,callback=self.parse_item,meta={'item':item},headers=headers)
??????? url:要請求的地址
??????? callback:響應成功之后的回調(diào)函數(shù)
??????? meta:參數(shù)傳遞
??????? headers:定制頭信息歉提,一般不用
????? response(對象)
??????? response.text:字符串格式文本
??????? response.body:二進制格式文本
??????? response.url:當前響應的url地址
??????? response.status:狀態(tài)碼
??????? response.xpath():篩選想要的數(shù)據(jù)
??????? response.css(): 篩選想要的數(shù)據(jù)
post請求
????? 【溫馨提示】
如果直接發(fā)送post請求笛坦,start_urls和parse方法就用不到
因為重寫了start_requests(self)這個方法,
【案例】:百度翻譯
????? scrapy.FormRequest(url=url,headers=headers, callback=self.parse_item
, formdata=data)
??????? url:要發(fā)送的post地址
??????? headers:定制頭信息
??????? callback:回調(diào)函數(shù)
??????? formdata: post所攜帶的數(shù)據(jù)【字典】
四:代理
????? 通過下載中間件來進行添加
????? (1)到settings.py中苔巨,打開一個選項
?????????? DOWNLOADER_MIDDLEWARES配置選項
????? (2)到middlewares.py中找到以下方法寫代碼
????? ?defprocess_request(self, request, spider):
?? ????? request.meta['proxy'] ='https://113.68.202.99:8888'
?? ???????return None
五:scrapy實現(xiàn)模擬登錄
?? 【案例】豆瓣-douban
https://accounts.douban.com/login
????? 【溫馨提示】
????????????Douban基于安全考慮-比較靠譜的網(wǎng)站版扩,登錄時需攜帶Cookie。
所以需要首先向登錄地址發(fā)送get請求侄泽,然后再向post地址發(fā)送post請求礁芦,因為中間要攜帶cookie,才能登錄成功
??????????? 請求模式【get==>post==>get】
六:存儲到mysql中
?? 【案例】-讀書項目
?????????? from scrapy.utils.project importget_project_settings
?? ????????settings = get_project_settings()