一掌动、User-Agent
有的網(wǎng)站通過User-Agent頭來識別爬蟲洽故,這個直接添加常見瀏覽器的User-Agent頭就好了:
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
二滥比、代理池
大部分網(wǎng)站都會通過檢測IP的請求頻率來防止爬蟲漠秋,這個時候就需要通過代理的方式請求,推薦幾個免費的代理IP網(wǎng)站:
當然實際上大部分不能用昔驱,所以一般要寫個爬蟲去爬取并驗證IP是否可用国拇,github上有個開源的項目幫我們做了這個事情:
https://github.com/qiyeboy/IPProxyPool
IPProxys代理池項目洛史,提供代理ip。使用python2.7.x開發(fā)
穩(wěn)定的項目最好還是用收費的代理酱吝,比如阿布云代理(https://www.abuyun.com/)
用一個簡單的程序說明如何使用代理池:
import requests
import gevent
from gevent import monkey
monkey.patch_socket()
#代理ip列表
ips = ['ip1:80','ip2:80','ip3:80','ip4:80','ip5:80','ip6:80','ip7:80','ip8:80','ip9:80','ip10:80']
def worker(i):
for j in range(i*10,i*10+10):
body = requests.get("http://www.example.com/%d.html" % j, proxies={'http':ips[i]}).text
#每個協(xié)程一個ip
tasks = [gevent.spawn(worker, i) for i in range(len(ips))]
gevent.joinall(tasks)
三也殖、多次請求
爬蟲并發(fā)量過高時可能一次爬取不成功,這時就需要多次請求务热,requests的adapters模塊可以達到這個目的:
from requests.adapters import HTTPAdapter
s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=3))
body = s.get("http://www.baidu.com").text
四忆嗜、ADSL動態(tài)IP
對于沒錢買IP的同學,可以用ADSL撥號切換IP崎岂,當然前提是你使用的網(wǎng)絡(luò)支持這個功能,一般校園網(wǎng)都支持的PPPOE協(xié)議就可以捆毫。原理就是隔一段時間重撥一下號,就會分配一個新的IP冲甘。windows下的rasdial命令可以完成這種操作:
rasdial /DISCONNECT //斷開連接
rasdial 寬帶連接 user passwd //撥號
用在程序里就是這樣:
import requests
import os
requests.get("http://www.example1.com")
os.system("rasdial /DISCONNECT")
os.system("rasdial 寬帶連接 user passwd")
requests.get("http://www.example2.com")