今天跟大家分享幾個
我在爬蟲中用到的技巧
技巧Ⅰ
爬取人家網(wǎng)站的時候頻率不要太高,
有事沒事睡一會,睡久了沒效率
睡短了,被反爬了,那就尷尬了....
隨機數(shù)更具有欺騙性
所以睡多久,random決定!
importtime
importrandom
foriinrange(1,11):
time?=?random.random()*5
print(f'第{i}次睡了:',?time,'s')
'''
第1次睡了:?0.6327309035891232 s
第2次睡了:?0.037961811128097045 s
第3次睡了:?0.7443093721610153 s
第4次睡了:?0.564336149517787 s
第5次睡了:?0.39922345839757245 s
第6次睡了:?0.13724989845026703 s
第7次睡了:?0.7877693301824763 s
第8次睡了:?0.5641490602064826 s
第9次睡了:?0.05517343036931721 s
第10次睡了:?0.3992618299505627 s
'''
所以可以試著在爬蟲代碼加入這句代碼
讓子彈飛一會
time.sleep(random.random()*5)
技巧Ⅱ
User-Agent中文名為用戶代理,簡稱 UA,
它是一個特殊字符串頭,使得服務(wù)器能夠識別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
簡單來說就是模擬瀏覽器去訪問頁面,
這樣才不會被網(wǎng)站反爬到。
但是哪里去搞user-agnet呢?
隨機數(shù)更具有欺騙性
所以哪里搞?李相赫決定!
fromfake_useragentimportUserAgent
foriinrange(1,11):
ua?=?UserAgent().random
print(f'第{i}次的ua是',?ua)
'''
第1次的ua是?Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/29.0.1547.62?Safari/537.36
第2次的ua是?Mozilla/5.0?(Windows?NT?6.1;?rv:21.0)?Gecko/20130401?Firefox/21.0
第3次的ua是?Mozilla/5.0?(Macintosh;?U;?Intel?Mac?OS?X?10_6_6;?es-es)?AppleWebKit/533.20.25?(KHTML,?like?Gecko)?Version/5.0.4?Safari/533.20.27
第4次的ua是?Mozilla/5.0?(X11;?CrOS?i686?4319.74.0)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/29.0.1547.57?Safari/537.36
第5次的ua是?Mozilla/5.0?(Macintosh;?U;?Intel?Mac?OS?X?10_6_6;?fr-ch)?AppleWebKit/533.19.4?(KHTML,?like?Gecko)?Version/5.0.3?Safari/533.19.4
第6次的ua是?Mozilla/5.0?(X11;?OpenBSD?i386)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/36.0.1985.125?Safari/537.36
第7次的ua是?Mozilla/5.0?(X11;?NetBSD)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/27.0.1453.116?Safari/537.36
第8次的ua是?Mozilla/5.0?(X11;?Linux?i586;?rv:31.0)?Gecko/20100101?Firefox/31.0
第9次的ua是?Mozilla/4.0?(compatible;?MSIE?8.0;?Windows?NT?6.1;?WOW64;?Trident/4.0;?SLCC2;?.NET?CLR?2.0.50727;?.NET?CLR?3.5.30729;?.NET?CLR?3.0.30729;?Media?Center?PC?6.0;?Zune?3.0)
第10次的ua是?Mozilla/5.0?(Windows?NT?5.1)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/31.0.1650.16?Safari/537.36
'''
夠用不?老板
所以可以試著在爬蟲代碼加入這句代碼
讓ua更具有欺騙性
headers= {'User-Agent':str(UserAgent().random)}
技巧Ⅲ
讓你事半功倍的瀏覽器插件
插件使用之前:

插件使用之后:

插件在哪里下載?
技巧Ⅳ
巧用pprint
這跟上面那個效果差不多,只不過剛才那個是在瀏覽器中查看的
而這個我們是在pycharm中查看的
來看效果吧
print()打印,不知道你感覺如何,我一臉懵逼
importrequests
url?='https://www.douyu.com/gapi/rknc/directory/yzRec/1'
resp?=?requests.get(url).json()
print(resp)
pprint()打印,這種結(jié)構(gòu)看起來如何呢?
frompprintimportpprint
importrequests
url?='https://www.douyu.com/gapi/rknc/directory/yzRec/1'
resp?=?requests.get(url).json()
pprint(resp)

技巧Ⅴ
對于頁面解析最強大的當(dāng)然是正則表達式,這個對于不同網(wǎng)站不同的使用者都不一樣,就不用過多的說明,附兩個比較好的網(wǎng)址:
正則表達式入門:
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
正則表達式在線測試:
http://tool.oschina.net/regex/
其次就是解析庫了,常用的有兩個lxml和BeautifulSoup,對于這兩個的使用介紹兩個比較好的網(wǎng)站:
lxml:http://my.oschina.net/jhao104/blog/639448
BeautifulSoup:http://cuiqingcai.com/1319.html
對于這兩個庫,我的評價是,都是HTML/XML的處理庫,
Beautifulsoup純python實現(xiàn),效率低,但是功能實用,
比如能用通過結(jié)果搜索獲得某個HTML節(jié)點的源碼;
lxml C語言編碼,高效,支持Xpath。
技巧Ⅵ
在一些網(wǎng)站服務(wù)中,除了對 user-agent 的身份信息進行檢測、
也對客戶端的 ip 地址做了限制,
如果是同一個客戶端訪問此網(wǎng)站服務(wù)器的次數(shù)過多就會將其識別為爬蟲,
因而,限制其客戶端 ip 的訪問。這樣的限制給我們的爬蟲帶來了麻煩,所以使用代理 ip 在爬蟲中是非常有必要的。
這里我給大家提供一下兩個網(wǎng)站供參考
66代理:http://www.66ip.cn/6.html
快代理:https://www.kuaidaili.com/free/
大家可以將這些ip使用爬蟲下載到本地,然后檢查每一個ip的狀態(tài)碼判斷其是否可用。
這樣每次使用爬蟲下載文件的時候。
只需使用random隨機使用一個就可以。
技巧Ⅶ
驗證碼我們在很多網(wǎng)站會遇到,如果請求量大了之后就會遇到驗證碼的情況。
最讓人詬病的12306,其實也是一定程度上的防止非正當(dāng)請求的產(chǎn)生。
對于驗證碼,可以通過OCR來識別圖片,Github上面有很多大神分享的代碼可以用,可以去看看。
簡單的OCR識別驗證碼:
fromPILimportImage
importtesserocr
#tesserocr識別圖片的2種方法
img?=?Image.open("code.jpg")
verify_code1?=?tesserocr.image_to_text(img)
#print(verify_code1)
verify_code2?=?tesserocr.file_to_text("code.jpg")
技巧Ⅷ
headers這應(yīng)該是最常見的,最基本的反爬蟲手段,主要是初步判斷你是否是真實的瀏覽器在操作。
遇到這類反爬機制,可以直接在自己寫的爬蟲中添加Headers,將瀏覽器的User-Agent復(fù)制到爬蟲的Headers中。
以edge瀏覽器為例,瀏覽器中打開頁面;
第一步:點擊上圖中“網(wǎng)絡(luò)”標(biāo)簽,然后刷新或載入頁面
第二步:在右側(cè)“標(biāo)頭”下方的“請求標(biāo)頭”中的所有信息都是headers內(nèi)容,添加到請求中即可。