處處是坑,且用且珍惜
入坑Python爬蟲已經(jīng)一周多了,哦,不對(duì),這篇文章本打算上周末寫的,然而周末總是過的很快(相信都深有體會(huì),哈哈),結(jié)果寫了個(gè)框架,內(nèi)容一點(diǎn)也沒填,所以,到現(xiàn)在應(yīng)該是已經(jīng)兩周多了。踩了很多坑,謹(jǐn)以此文紀(jì)念我一周多的Python的Scrapy爬蟲
scrapy入門
文檔(0.24中文):http://scrapy-chs.readthedocs.io/zh_CN/0.24/index.html
文檔(1.2英文):https://doc.scrapy.org/en/1.2/index.html
寫了好多了,感覺停不下來了,還是另寫一篇入門文章吧,寫好后鏈接更新到這里
今天還是先把上周挖好的坑填了吧
scrapy的meta
scrapy的meta的作用就是在執(zhí)行scrapy.Request()函數(shù)時(shí)把一些回掉函數(shù)中需要的數(shù)據(jù)傳進(jìn)去,meta必須是一個(gè)字典,在下一個(gè)函數(shù)中可以使用response.meta防問
如:
def parse(self, response):
yield scrapy.Request(url='baidu.com', callback=detailpage, meta={website:'百度'})
def detailpage(self, response):
website = response.meta['website']
Python中的json解析:
爬蟲離不了json的解析,很多傳統(tǒng)網(wǎng)站中可能并不需要,但是目前很多新網(wǎng)站中都使用json進(jìn)行數(shù)據(jù)傳輸,動(dòng)態(tài)展現(xiàn),所以json的解析對(duì)于爬蟲是很重要的
python解析json的包是json,使用時(shí)需要先引入json包
import json
常用的三個(gè)函數(shù)load(),loads(),dumps()
json.loads():傳入一個(gè)json字符串,返回一個(gè)字符串解析出來的list或dict
json.load():這貨長(zhǎng)的和json.loads()很像,但是絕對(duì)不一樣,這個(gè)函數(shù)的作用是從文件中讀取json并解析成dict或list
json.dumps():把一個(gè)dict或list轉(zhuǎn)換成字符串,相當(dāng)于json.loads()的逆向過程
還有一個(gè)json.dump():與文件操作結(jié)合的,實(shí)際中用的不多,不再介紹
例:
import json
dict = {'name':'qitiandasheng','age':18}
str = json.dumps(dict)
data = json.loads(str)
with open('test.json','w') as f:
data = json.load(f)
字符串函數(shù):
常見的字符串處理函數(shù):
replace():字符串類型才有這個(gè)函數(shù),傳入兩個(gè)參數(shù),第一個(gè)是需要替換的字符串,第二個(gè)是替換成什么,會(huì)循環(huán)替換所有匹配到的字符串
strip():去除左右兩邊的空字符
正則表達(dá)式:
對(duì)于字符串處理,還有更強(qiáng)大的正則表達(dá)式,python中要使用正則表達(dá)式,需要先引入re模塊
import re
Python中正則表達(dá)式有兩種使用方式,一種是通過re模塊的compile()函數(shù)先生成一個(gè)正則表達(dá)式對(duì)象,然后用這個(gè)正則表達(dá)式對(duì)象去匹配字符串,這種方式調(diào)用函數(shù)時(shí)不需要傳入正則表達(dá)式,當(dāng)一個(gè)正則表達(dá)式需要重復(fù)多次使用時(shí)建議使用此方式,他會(huì)先編譯正則表達(dá)式,然后再去匹配,速度想對(duì)較快;還有一種方式是直接使用re模塊的各個(gè)函數(shù),第一個(gè)參數(shù)需要傳入正則表達(dá)式
常用的四個(gè)函數(shù):
re.compile():傳入正則表達(dá)式字符串,推薦使用r''的這種原始字符串,不需要對(duì)一些特定字符轉(zhuǎn)義,此函數(shù)返回一個(gè)正則表達(dá)式對(duì)象
re.match():從字符串的開始處匹配,匹配到返回match對(duì)象
re.search():從任意字符處開始匹配,匹配到就返回一個(gè)match對(duì)象
re.findall():從任意字符處開始匹配,匹配到所有的結(jié)果,返回一個(gè)list
match()和search()返回的是一個(gè)match對(duì)象,有group()和groups()兩個(gè)方法:
group():不傳參數(shù)時(shí)相當(dāng)于group(0)返回所有匹配的結(jié)果,當(dāng)傳入數(shù)字時(shí),如group(1),返回第1組括號(hào)匹配到的結(jié)果
groups():以tuple形式返回所有匹配到的結(jié)果
re.findall()的返回結(jié)果:
list中每個(gè)元素的值的類型,取決于正則表達(dá)式的寫法
當(dāng)list中元素是字符串時(shí):你的正則表達(dá)式中沒有捕獲的組(不分組,或非捕獲分組)
字符串的值就是你的正則表達(dá)式所匹配到的單個(gè)完整的字符串
當(dāng)list中元素是tuple時(shí):你的正則表達(dá)式中有(帶捕獲的)分組(簡(jiǎn)單可理解為有括號(hào))
tuple的值,是各個(gè)group的值所組合出來的
https://m.baidu.com/feed/data/landingpage?nid=2740700877946007370&n_type=1&p_from=2&type=share
換行符^M
一大坑,windows和linux換行符不同,在windows上編輯的文件上傳到linux上就會(huì)多一個(gè)^M符號(hào)
爬過的頁面不會(huì)再爬
scrpay有個(gè)機(jī)制,在一個(gè)spider中,當(dāng)一個(gè)向一個(gè)url發(fā)送請(qǐng)求之后,如果再次請(qǐng)求該url,scrapy不在處理
allowed domains
生成spider時(shí),會(huì)在allowed domains中加入允許訪問的域名,如果在此spider中訪問改域名外的url,scrapy不會(huì)請(qǐng)求
fiddler的https配置
首先要配置fiddler抓取https的包:

然后,在手機(jī)上輸入,代理ip和端口,如192.168.1.5:8888,點(diǎn)擊FiddlerRootcertificate安裝證書,就可以抓取https的數(shù)據(jù)包了
python新手常見錯(cuò)誤:https://www.oschina.net/question/89964_62779
做過兩年多公眾號(hào)的我寫東西盡然毫無排版,哈哈哈哈
終于寫完了,睡覺zzz
明天有時(shí)間把scrapy入門補(bǔ)上