使用 Pyspider 爬取京东 Wap 版本商品价格

2014-12-31 20:12:57 +08:00
 imlonghao

爬虫运行在 @binux 的 Pyspider


总想找一个站来练习一下写爬虫,于是乎,我找到了京东的Wap版。

关于京东Wap版

优点
1. 没有反爬虫的设置,似乎不限制并发链接
2. 单个页面大小比较小,对VPS来说节省流量
3. 链接结构比较整齐,比较容易分析

缺点
1. 可以采集的数据比较少,只有商品分类、名称和价格
2. 单个分类分页最多2000页,但其实不仅仅有2000页

链接分析

我们大概的思路就是:全部分类-->二级分类-->三级分类-->遍历全部分页-->采集数据

打开wap.jd.com后,我们不难就可以看出全部分类的地址:http://wap.jd.com/category/all.html

然后我们观察链接,二级分类的地址均是以http://wap.jd.com/category/开头的

三级分类的地址均是以http://wap.jd.com/products/开头的

然后,我们就可以看到商品列表页了。

在商品页中,有两类链接我们需要分析。一是商品详细页的地址,以http://wap.jd.com/product/开头;另一个是页面的页数,我们使用Pyspider的分析工具,可以知道页面的页数是HTML>BODY>DIV.page>A[href]里面的。

知道了上面的信息,我们基本上就可以写代码开始采集了。

注意

京东的地址中,会传入一个区别不同用户的cid和sid的值,例如我的就是cid=1323&sid=24faaa1458222af7f13as9kf3aa12337,实际上链接只有.html前面的部分是有用的,.html后面?开始其实都是可以忽略的。

在Pyspider中,系统是通过url来区别不同的地址的,如果是sid不同的话,会被识别成不同的页面,最后的话可能会造成重复采集的结果。

因此,我打算使用urlparse模块中的urljoin来处理这些地址,可能方法有点不对,但是还是达到了效

代码

请参考我的网站:https://imlonghao.com/Pyspider/wap.jd.com.html

后记

使用Pyspider的效率我个人还是满意的,总共大概就是我2天爬了将近500W商品,速度其实可以再进一步,因为我不敢开太大并发因为已经VPS的内存不够..............

除此之外,硬盘也不够了,记录使用默认的配置,results.db总共占用了2.1G,而tasks.db占用了12G左右

此外,给@binux 反馈一个问题,像我这样500W数据的话,通过/results/dump/jd.json无法导出数据,显示超时....

9656 次点击
所在节点    程序员
35 条回复
marksaas
2015-01-02 11:12:26 +08:00
发我一份吧,mark_wk#qq.com,多谢。。
benjiam
2015-01-02 17:35:56 +08:00
你是拉所有的产品详细情况还是 产品列表吗?

http://wap.jd.com/products/1315-1343-1354-0-0-0-0-0-0-0-1-1-2.html?cid=1354&sid=e3fd661f50a653203402decbfe71b57e

这种产品列表吗?如果是产品列表的话,应该非常快

我简单的计算了一下
500万产品, 单页大概150K, 每页大概15种产品 gzip 的话 算压缩到0.25

500.0* 10 * 1024 * 150 * 1024 / 15 / 4 /1024/ 1024/1024
大概是12G 数据
imlonghao
2015-01-02 17:46:57 +08:00
@benjiam 只保存了商品名字,价格和分类。最后json格式,只有1.9G,不知道我有没有数错行数,你要的话可以留邮箱拿去看看
benjiam
2015-06-07 23:50:29 +08:00
貌似已经不能用来 现在默认会跳到m.jd.com
benjiam
2015-06-07 23:56:43 +08:00
已经破解 很简单
UnderIndex
2015-07-27 18:24:30 +08:00
@benjiam 你遇到过评论重复的情况吗,就是请求太频繁会返回的评论结果是一样的。
l0wkey
2016-02-15 12:04:21 +08:00
@binux
我也遇到无法导出了, wget 的 json 流,数据量是 300w 多一点

--2016-02-15 11:51:41-- http://127.0.0.1:5000/results/dump/zhi.json
Connecting to 127.0.0.1:5000... connected.
HTTP request sent, awaiting response... 401 UNAUTHORIZED
Connecting to 127.0.0.1:5000... connected.
HTTP request sent, awaiting response... 500 INTERNAL SERVER ERROR
2016-02-15 11:52:41 ERROR 500: INTERNAL SERVER ERROR.
binux
2016-02-15 23:27:18 +08:00
@l0wkey 日志,栈信息
l0wkey
2016-02-15 23:58:55 +08:00
@binux
日志无相关信息..
binux
2016-02-16 02:12:07 +08:00
@l0wkey webui 出错时的日志
l0wkey
2016-02-16 11:16:37 +08:00
@binux
[E 160215 11:35:00 app:1423] Exception on /results/dump/zhihu.json [GET]
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python2.7/dist-packages/pyspider/webui/result.py", line 37, in dump_result
resultdb.get(project, 'any')
File "/usr/local/lib/python2.7/dist-packages/pyspider/database/mysql/resultdb.py", line 99, in get
where=where, where_values=(taskid, )):
File "/usr/local/lib/python2.7/dist-packages/pyspider/database/basedb.py", line 69, in _select2dic
dbcur = self._execute(sql_query, where_values)
File "/usr/local/lib/python2.7/dist-packages/pyspider/database/basedb.py", line 36, in _execute
dbcur.execute(sql_query, values)
File "/usr/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 515, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/local/lib/python2.7/dist-packages/pyspider/webui/result.py", line 37, in dump_result
resultdb.get(project, 'any')
File "/usr/local/lib/python2.7/dist-packages/pyspider/database/mysql/resultdb.py", line 99, in get
where=where, where_values=(taskid, )):
File "/usr/local/lib/python2.7/dist-packages/pyspider/database/basedb.py", line 69, in _select2dic
dbcur = self._execute(sql_query, where_values)
File "/usr/local/lib/python2.7/dist-packages/pyspider/database/basedb.py", line 36, in _execute
dbcur.execute(sql_query, values)
File "/usr/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 515, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 488, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 395, in _handle_result
raise errors.get_exception(packet)
DatabaseError: 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
[I 160215 11:35:00 _internal:87] 127.0.0.1 - - [15/Feb/2016 11:35:00] "GET /results/dump/zhihu.json HTTP/1.1" 500 -
binux
2016-02-16 11:36:58 +08:00
@l0wkey 你访问 http://localhost:5000/task/project:any 也 500 吗?
l0wkey
2016-02-16 11:45:36 +08:00
@binux
/task/project:any 404
/task/project:_NAME 也 404

指的 /tasks?project=_NAME 么?这个访问正常
binux
2016-02-16 12:18:36 +08:00
@l0wkey project 替换成你导出的 project
l0wkey
2016-02-16 12:30:57 +08:00
@binux
/task/_NAME:any 404
/task/_NAME 400

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/158294

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX