爬蟲總結
- 2019 年 10 月 3 日
- 筆記
爬取網站的思路
- 先確定是否為動態載入網站
- 找URL規律
- 正則表達式或xpath
- 定義程式框架,補全並測試程式碼
多級頁面數據抓取
1、爬取一級頁面,提取所需數據+鏈接,繼續跟進
2、爬取二級頁面,提取所需數據+鏈接,繼續跟進
3、…
爬蟲程式碼規範書寫:
# 程式結構 class xxxSpider(object): def __init__(self): # 定義常用變數,url,headers及計數等 def get_html(self): # 獲取響應內容函數,使用隨機User-Agent def parse_html(self): # 使用正則表達式來解析頁面,提取數據 def write_html(self): # 將提取的數據按要求保存,csv、MySQL資料庫等 def main(self): # 主函數,用來控制整體邏輯 if __name__ == '__main__': # 程式開始運行時間戳 start = time.time() spider = xxxSpider() spider.main() # 程式運行結束時間戳 end = time.time() print('執行時間:%.2f' % (end-start))
常見的反爬總結
基於User-Agent反爬
一般被關注的變數是userAgent和Referer和Cookie,可以考慮用瀏覽器中
1、發送請求攜帶請求頭: headers={‘User-Agent’ : ‘Mozilla/5.0 xxxxxx’}
User-Agent限制:網站可能會判斷當某一個User-Agent高頻率訪問的時候,會加以限制。
解決方法:
1、定義列表存放大量User-Agent,使用random.choice()每次隨機選擇
2、定義py文件存放大量User-Agent,使用random.choice()每次隨機選擇
3、使用fake_useragent每次訪問隨機生成User-Agent
from fake_useragent import UserAgent ua = UserAgent() user_agent = ua.random print(user_agent)
IP限制:網站根據IP地址訪問頻率進行反爬,短時間內進位IP訪問
解決方案:
1、構造自己IP代理池,每次訪問隨機選擇代理,經常更新代理池
2、購買開放代理或私密代理IP
3、降低爬取的速度
Cookies:建立有效的Cookie池,每次訪問隨機切換
1、適用網站類型: 爬取網站頁面時需要登錄後才能訪問,否則獲取不到頁面的實際響應數據
2、方法1(利用cookie)
1、先登錄成功1次,獲取到攜帶登陸資訊的Cookie(處理headers)
2、利用處理的headers向URL地址發請求
3、方法2(利用session會話保持)
1、實例化session對象
session = requests.session()
2、先post : session.post(post_url,data=post_data,headers=headers)
1、登陸,找到POST地址: form -> action對應地址
2、定義字典,創建session實例發送請求
# 字典key :<input>標籤中name的值(email,password)
# post_data = {’email’:”,’password’:”}
3、再get : session.get(url,headers=headers)
驗證碼:驗證碼數量較少可人工填寫,圖形驗證碼可使用tesseract識別,其他情況只能在線打碼、人工打碼和訓練機器學習模型
響應內容前端JS做處理反爬
1、html頁面中可匹配出內容,程式中匹配結果為空
- 響應內容中嵌入js,對頁面結構做了一定調整導致,通過列印查看網頁源程式碼,格式化輸出查看結構,更改xpath或者正則測試
2、如果數據出不來可考慮更換 IE 的User-Agent嘗試,數據返回最標準
From表達數據認證(salt、sign)簽名及js加密:一般為本地JS加密,查找本地JS文件,分析,或者使用execjs模組執行JS
js調整頁面結構
js在響應中指定新地址:從響應程式碼中找目標地址,政府行政編碼
動態生成
動態載入的數據,數據不再網頁程式碼中,而是在後台的非同步載入的數據包中。
1、F12打開控制台,頁面動作抓取網路數據包
2、抓取json文件URL地址
# 控制台中 XHR :非同步載入的數據包
# XHR -> Query String(查詢參數)
請求模組總結
urllib庫使用流程
# 編碼 params = { '':'', '':'' } params = urllib.parse.urlencode(params) url = baseurl + params # 請求 request = urllib.request.Request(url,headers=headers) response = urllib.request.urlopen(request) html = response.read().decode('utf-8')
requests模組使用流程
baseurl = 'http://tieba.baidu.com/f?' html = requests.get(baseurl,params=params,headers=headers).content.decode('utf-8','ignore')
寫程式最終目的:程式不要因為任何異常而終止,頁面請求設置超時時間,並用try捕捉異常,超過指定次數更換下一個url地址
解析模組總結
正則解析re模組
import re pattern = re.compile('正則表達式',re.S) r_list = pattern.findall(html)
lxml解析庫
from lxml import etree parse_html = etree.HTML(res.text) r_list = parse_html.xpath('xpath表達式')
json
# json # 響應內容由json轉為python html = json.loads(res.text) # 所抓數據保存到json文件 with open('xxx.json','a') as f: json.dump(item_list,f,ensure_ascii=False) # 或 f = open('xxx.json','a') json.dump(item_list,f,ensure_ascii=False) f.close()
Chrome瀏覽器安裝插件
在線安裝
- 下載插件 – google訪問助手
- 安裝插件 – google訪問助手: Chrome瀏覽器-設置-更多工具-擴展程式-開發者模式-拖拽(解壓後的插件)
- 在線安裝其他插件 – 打開google訪問助手 – google應用商店 – 搜索插件 – 添加即可
離線安裝
- 下載插件 – xxx.crx 重命名為 xxx.zip,解壓不解壓都可以,我沒解壓
- 打開Chrome瀏覽器 -> 右上角設置 -> 更多工具 -> 擴展程式 -> 點開開發者模式
- 把相關插件文件夾 拖拽 到瀏覽器中,釋放滑鼠即可安裝
- 重啟瀏覽器,使插件生效
爬蟲常用插件插件
- google-access-helper : Google訪問助手,可訪問 Google應用商店
- Xpath Helper: 輕鬆獲取HTML元素的xPath路徑,開啟/關閉: Ctrl + Shift + x
- Proxy SwitchyOmega: Chrome瀏覽器中的代理管理擴展程式
- JsonView: 格式化輸出json格式數據
