爬蟲總結

  • 2019 年 10 月 3 日
  • 筆記

爬取網站的思路

  1. 先確定是否為動態載入網站
  2. 找URL規律
  3. 正則表達式或xpath
  4. 定義程式框架,補全並測試程式碼

多級頁面數據抓取

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地址

scrapy框架爬蟲

selenium+browser爬蟲

解析模組總結

正則解析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瀏覽器安裝插件

在線安裝

  1. 下載插件 – google訪問助手
  2. 安裝插件 – google訪問助手: Chrome瀏覽器-設置-更多工具-擴展程式-開發者模式-拖拽(解壓後的插件)
  3. 在線安裝其他插件 – 打開google訪問助手 – google應用商店 – 搜索插件 – 添加即可

離線安裝

  1. 下載插件 – xxx.crx 重命名為 xxx.zip,解壓不解壓都可以,我沒解壓
  2. 打開Chrome瀏覽器 -> 右上角設置 -> 更多工具 -> 擴展程式 -> 點開開發者模式
  3. 把相關插件文件夾 拖拽 到瀏覽器中,釋放滑鼠即可安裝
  4. 重啟瀏覽器,使插件生效

爬蟲常用插件插件

  1. google-access-helper : Google訪問助手,可訪問 Google應用商店
  2. Xpath Helper: 輕鬆獲取HTML元素的xPath路徑,開啟/關閉: Ctrl + Shift + x
  3. Proxy SwitchyOmega: Chrome瀏覽器中的代理管理擴展程式
  4. JsonView: 格式化輸出json格式數據