爬蟲技巧分享

爬蟲基本的流程
• 發送請求:通過HTTP庫向目標站點發起請求,即發送一個Request,請求可以包含額外的headers等信息,等待服務器響應。
• 獲取響應內容:如果服務器能正常響應,會得到一個Response, Response的內容便是所要獲取的頁面內容,類型可能有HTML,Json字符串,二進制數據(如圖片視頻)等類型。
• 解析內容:得到的內容可能是HTML,可以用正則表達式、網頁解析庫進行解析。可能是Json,可以直接轉爲Json對象解析,可能是二進制數據,可以做保存或者進一步的處理。
• 保存數據:保存形式多樣,可以存爲文本,也可以保存至數據庫,或者保存特定格式的文件。
什麼是Request和Response?
在這裏插入圖片描述
最基本的爬取
抓取大多數情況屬於get請求,即直接從對方服務器上獲取數據。
首先,Python中自帶urllib及urllib2這兩個模塊,基本上能滿足一般的頁面抓取。另外,requests也是非常有用的包,與此類似的,還有httplib2等等。
import requests
url = http://current.ip.16yun.cn:802
response = requests.get(url)
content = requests.get(url).content
print(「response headers:」, response.headers)
print(「content:」, content)
此外,對於帶有查詢字段的url,get請求一般會將來請求的數據附在url之後,以?分割url和傳輸數據,多個參數用&連接。
import requests
data = {‘wd’:‘nike’, ‘ie’:‘utf-8’}
url=‘https://www.baidu.com’
response = requests.get(url=url, params=data)
使用代理服務器
這在某些情況下比較有用,比如IP被封了,或者比如IP訪問的次數受到限制等等。
#! – encoding:utf-8 –
import requests
import random
# 要訪問的目標頁面
targetUrl = 「http://httpbin.org/ip」
# 要訪問的目標HTTPS頁面
# targetUrl = 「https://httpbin.org/ip」
# 代理服務器(產品官網 www.16yun.cn)
proxyHost = 「t.16yun.cn」
proxyPort = 「31111」
# 代理隧道驗證信息
proxyUser = 「username」
proxyPass = 「password」
proxyMeta = 「http://%(user)s:%(pass)[email protected]%(host)s:%(port)s」 % { 「host」 : proxyHost, 「port」 : proxyPort, 「user」 : proxyUser, 「pass」 : proxyPass, } # 設置 http和https訪問都是用HTTP代理 proxies = { 「http」 : proxyMeta, 「https」 : proxyMeta, } # 設置IP切換頭 tunnel = random.randint(1,10000) headers = {「Proxy-Tunnel」: str(tunnel)} resp = requests.get(targetUrl, proxies=proxies, headers=headers) print resp.status_code print resp.text cookie的處理 import urllib2, cookielib cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar()) opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) urllib2.install_opener(opener) content = urllib2.urlopen(‘http://XXXX’).read() 是的沒錯,如果想同時用代理和cookie,那就加入proxy_support然後operner改爲 opener = urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler) 表單的處理 這種情況屬於post請求,即先向服務器發送表單數據,服務器再將返回的cookie存入本地。 import requests data = {‘data1’:‘XXXXX’, ‘data2’:‘XXXXX’} response = requests.post(url=url, data=data) 僞裝成瀏覽器,或者反「反盜鏈」 有些網站會檢查你是不是真的瀏覽器訪問,還是機器自動訪問的。這種情況,加上User-Agent,表明你是瀏覽器訪問即可。有時還會檢查是否帶Referer信息還會檢查你的Referer是否合法,一般再加上Referer。 User-Agent可以用億牛雲提供給的真實庫,Referer的來源可以僞裝成百度搜索來的。 headers = {‘User-Agent’:‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.1276.73 Safari/537.36’, ‘Referer’:‘https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=nike’} response = requests.get(url=url, headers=headers) 爬蟲有很多小技巧,以上只是一部分