爬虫是一门综合技术,涉及网页请求,图像处理(验证码识别),数据存储...
本文介绍了通用的爬虫设计流程
页面分析
-
- 请求分析
- 分析目标网站,查看所要爬取的内容隐藏在哪个url下,一般用浏览器的F12键或者fiddler抓包工具进行分析
- 查看请求方式(GET/POST),请求参数类型(parameters/json/formdata parameters--直接拼接在url中,json--采用json.dumps(dict(data)), formdata--dict(data)),以及参数从何处获取
-
- 页面内容分析
- 通过lxml解析,或者直接看文本查找目标内容
-
如图:将内容copy下来,分析是否有目标内容(有些内容隐藏在ajax请求中)
反爬测试
- 直接通过requests测试返回结果
- 若1.失败,则添加headers继续测试
# 将浏览器的request headers复制下来传入函数,
# 获取对应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
- 若返回结果仍无目标字段,则检查是否存在js渲染(若简单,破解之,若复杂采用selenium)
- 多个线程同时请求,测试目标网站IP限制策略
# 手工记个时间,大致判断并发多少IP会被禁掉
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()
- 如碰到验证码,请移步--验证识别传送门,坑较多,需要花点时间
框架设计
- 爬虫请求&解析模块(队列设计,实现分布式,弹性扩展)
- 数据存储模块
- 异常处理模块
- 代理池
- 其它(验证码破解等)