處處是坑,且用且珍惜
入坑Python爬蟲已經(jīng)一周多了彼水,哦崔拥,不對,這篇文章本打算上周末寫的凤覆,然而周末總是過的很快(相信都深有體會链瓦,哈哈),結(jié)果寫了個框架盯桦,內(nèi)容一點也沒填慈俯,所以,到現(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ù)據(jù)傳進(jìn)去洋闽,meta必須是一個字典,在下一個函數(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ù)傳輸,動態(tài)展現(xiàn)阳似,所以json的解析對于爬蟲是很重要的
python解析json的包是json骚勘,使用時需要先引入json包
import json
常用的三個函數(shù)load(),loads(),dumps()
json.loads():傳入一個json字符串,返回一個字符串解析出來的list或dict
json.load():這貨長的和json.loads()很像撮奏,但是絕對不一樣俏讹,這個函數(shù)的作用是從文件中讀取json并解析成dict或list
json.dumps():把一個dict或list轉(zhuǎn)換成字符串,相當(dāng)于json.loads()的逆向過程
還有一個json.dump():與文件操作結(jié)合的畜吊,實際中用的不多泽疆,不再介紹
例:
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():字符串類型才有這個函數(shù),傳入兩個參數(shù)玲献,第一個是需要替換的字符串殉疼,第二個是替換成什么,會循環(huán)替換所有匹配到的字符串
strip():去除左右兩邊的空字符
正則表達(dá)式:
對于字符串處理捌年,還有更強大的正則表達(dá)式瓢娜,python中要使用正則表達(dá)式,需要先引入re模塊
import re
Python中正則表達(dá)式有兩種使用方式礼预,一種是通過re模塊的compile()
函數(shù)先生成一個正則表達(dá)式對象眠砾,然后用這個正則表達(dá)式對象去匹配字符串,這種方式調(diào)用函數(shù)時不需要傳入正則表達(dá)式托酸,當(dāng)一個正則表達(dá)式需要重復(fù)多次使用時建議使用此方式褒颈,他會先編譯正則表達(dá)式,然后再去匹配励堡,速度想對較快谷丸;還有一種方式是直接使用re模塊的各個函數(shù),第一個參數(shù)需要傳入正則表達(dá)式
常用的四個函數(shù):
re.compile():傳入正則表達(dá)式字符串应结,推薦使用r''的這種原始字符串刨疼,不需要對一些特定字符轉(zhuǎn)義,此函數(shù)返回一個正則表達(dá)式對象
re.match():從字符串的開始處匹配摊趾,匹配到返回match對象
re.search():從任意字符處開始匹配币狠,匹配到就返回一個match對象
re.findall():從任意字符處開始匹配,匹配到所有的結(jié)果砾层,返回一個list
match()
和search()
返回的是一個match對象,有group()
和groups()
兩個方法:
group():不傳參數(shù)時相當(dāng)于group(0)返回所有匹配的結(jié)果贱案,當(dāng)傳入數(shù)字時肛炮,如group(1)止吐,返回第1組括號匹配到的結(jié)果
groups():以tuple形式返回所有匹配到的結(jié)果
re.findall()
的返回結(jié)果:
list中每個元素的值的類型,取決于正則表達(dá)式的寫法
當(dāng)list中元素是字符串時:你的正則表達(dá)式中沒有捕獲的組(不分組侨糟,或非捕獲分組)
字符串的值就是你的正則表達(dá)式所匹配到的單個完整的字符串
當(dāng)list中元素是tuple時:你的正則表達(dá)式中有(帶捕獲的)分組(簡單可理解為有括號)
tuple的值碍扔,是各個group的值所組合出來的
https://m.baidu.com/feed/data/landingpage?nid=2740700877946007370&n_type=1&p_from=2&type=share
換行符^M
一大坑,windows和linux換行符不同秕重,在windows上編輯的文件上傳到linux上就會多一個^M符號
爬過的頁面不會再爬
scrpay有個機制不同,在一個spider中,當(dāng)一個向一個url發(fā)送請求之后溶耘,如果再次請求該url二拐,scrapy不在處理
allowed domains
生成spider時,會在allowed domains中加入允許訪問的域名凳兵,如果在此spider中訪問改域名外的url百新,scrapy不會請求
fiddler的https配置
首先要配置fiddler抓取https的包:
然后,在手機上輸入庐扫,代理ip和端口饭望,如192.168.1.5:8888,點擊FiddlerRootcertificate安裝證書形庭,就可以抓取https的數(shù)據(jù)包了
python新手常見錯誤:https://www.oschina.net/question/89964_62779
做過兩年多公眾號的我寫東西盡然毫無排版铅辞,哈哈哈哈
終于寫完了,睡覺zzz
明天有時間把scrapy入門補上