哪些地方需要改进和注意的地方,或更好的爬虫策略。
下面是伪代码 欢迎批评指正!
数据模型
class Obj:
pass
常量
Objs = [] 对象容器
IPS = [] 代理池
函数
1. 构造代理 ip 池
def build_ips():
....
return ips
2. 下载页面
- 随机选取代理 ip 下载页面,限制 timeout ,超时或异常更换 ip ,最多重试 5 次
- 基础页下载(含 params 参数),详细页下载不含参数
def download_html(url,params=None)
....
return html
3. 构造参数组合(不包含页码)
- 如:城市+关键字 的组合
def build_params_lst(citys,kds):
....
return params_lst
4. 解析基础页(带请求参数,不含页码),构造 Obj-->Objs
- 页码上限设置很大。
- 参数=原参数+页码。
- 解析基础信息(至少包含详细页面 url)并 push 到 Objs 列表
- 该页码下内容为空则 return ,中断页码遍历
def parse_html(params)
obj = Obj()
obj.name = ....
....
Objs.append(obj)
return None
5. 解析详细页面,更新 obj 详细信息。
def get_detail(obj):
url = obj.url
....
obj.detail = ...
return None
程序执行
1. IPS = build_ips()
2. params_lst = build_params_lst()
3. 多线程基础下载解析 函数: parse_html 参数迭代器: params_lst
4. 多线程详细页面下载解析 函数: get_detail 参数迭代器 Objs
5. 遍历 Objs ,添加 obj 到数据库
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.