爬蟲(chóng)是一門(mén)綜合技術(shù),涉及網(wǎng)頁(yè)請(qǐng)求,圖像處理(驗(yàn)證碼識(shí)別),數(shù)據(jù)存儲(chǔ)...
本文介紹了通用的爬蟲(chóng)設(shè)計(jì)流程
頁(yè)面分析
-
- 請(qǐng)求分析
- 分析目標(biāo)網(wǎng)站,查看所要爬取的內(nèi)容隱藏在哪個(gè)url下,一般用瀏覽器的F12鍵或者fiddler抓包工具進(jìn)行分析
- 查看請(qǐng)求方式(GET/POST),請(qǐng)求參數(shù)類(lèi)型(parameters/json/formdata parameters--直接拼接在url中,json--采用json.dumps(dict(data)), formdata--dict(data)),以及參數(shù)從何處獲取
-
- 頁(yè)面內(nèi)容分析
- 通過(guò)lxml解析,或者直接看文本查找目標(biāo)內(nèi)容
-
如圖:將內(nèi)容copy下來(lái),分析是否有目標(biāo)內(nèi)容(有些內(nèi)容隱藏在ajax請(qǐng)求中)
反爬測(cè)試
- 直接通過(guò)requests測(cè)試返回結(jié)果
- 若1.失敗,則添加headers繼續(xù)測(cè)試
# 將瀏覽器的request headers復(fù)制下來(lái)傳入函數(shù),
# 獲取對(duì)應(yīng)dict
def header_parser(header):
lines = header.split('\n')
header_dict = {}
for line in lines:
line = line.strip()
if line:
k, v = line.split(': ', 1)
header_dict[k] = v
return header_dict
- 若返回結(jié)果仍無(wú)目標(biāo)字段,則檢查是否存在js渲染(若簡(jiǎn)單,破解之,若復(fù)雜采用selenium)
- 多個(gè)線程同時(shí)請(qǐng)求,測(cè)試目標(biāo)網(wǎng)站IP限制策略
# 手工記個(gè)時(shí)間,大致判斷并發(fā)多少I(mǎi)P會(huì)被禁掉
import re
import requests
from threading import Thread
def query(url):
resp = requests.get(url)
flag = re.findall(r'target', resp.content.decode())
status_code = resp.status_code
if status_code != 200 or not flag:
print('query bad ...')
def multi_thread(num):
for i in range(num):
t = Thread(target=query, args=('http://target.com', ))
t.start()
- 如碰到驗(yàn)證碼,請(qǐng)移步--驗(yàn)證識(shí)別傳送門(mén),坑較多,需要花點(diǎn)時(shí)間
框架設(shè)計(jì)
- 爬蟲(chóng)請(qǐng)求&解析模塊(隊(duì)列設(shè)計(jì),實(shí)現(xiàn)分布式,彈性擴(kuò)展)
- 數(shù)據(jù)存儲(chǔ)模塊
- 異常處理模塊
- 代理池
- 其它(驗(yàn)證碼破解等)