scrapy爬蟲一定會用到的小技巧

處處是坑,且用且珍惜

入坑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á)式:

對于字符串處理,還有更強(qiáng)大的正則表達(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有個機(jī)制,在一個spider中,當(dāng)一個向一個url發(fā)送請求之后,如果再次請求該url,scrapy不在處理

allowed domains

生成spider時,會在allowed domains中加入允許訪問的域名,如果在此spider中訪問改域名外的url,scrapy不會請求

fiddler的https配置

首先要配置fiddler抓取https的包:

Paste_Image.png

然后,在手機(jī)上輸入,代理ip和端口,如192.168.1.5:8888,點擊FiddlerRootcertificate安裝證書,就可以抓取https的數(shù)據(jù)包了

python新手常見錯誤:https://www.oschina.net/question/89964_62779

做過兩年多公眾號的我寫東西盡然毫無排版,哈哈哈哈
終于寫完了,睡覺zzz
明天有時間把scrapy入門補(bǔ)上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 12,763評論 4 46
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,268評論 0 4
  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,048評論 0 13
  • 孩子的思想
    amptygirl閱讀 398評論 0 1