怎么写个通用一点的抓取某网页的内容

2014-05-18 15:39:05 +08:00
 pythonee
经常碰到有人问我,他们想订阅某网站的更新,但是不是整个网页,而是某个区块,抓取后可以存为图片也可以格式化后丢到文件里,我知道用现在的库可以很方便的抓取一个网页和存为图片,主要的问题是怎么把某个div抓出来,而且通用点,因为站点有点多
5652 次点击
所在节点    程序员
21 条回复
rekey
2014-05-18 16:11:00 +08:00
read it late ?
Livid
2014-05-18 16:16:09 +08:00
PhantomJS
lbj96347
2014-05-18 16:21:44 +08:00
如果这些div有一个通用的特征,例如位置,class,id,甚至颜色等,应该都可以通过这些特征抓取到,这里可以通过写正则写定位的方式,定位到。

而工具的话,可以采用phantomjs实现,因为有些时候做前端自动化测试等,或者一些比较高质量的定向爬虫,phantomjs很好用,因为这个东西可以模拟一个真实的浏览器环境出来。而且你还可以加入一个jQuery这样的包,方便你的dom操作。
lbj96347
2014-05-18 16:22:42 +08:00
@Livid 哈哈,我写了太多的废话,被你抢了一步。:-)
shiny
2014-05-18 16:32:29 +08:00
写过一个 bot,只要会用 css 定位出区块就可以把内容图片链接抓出来。
抓内容需要的工作是配置下 css 即可。
pythonee
2014-05-18 19:21:45 +08:00
@Livid PhantomJS好像有乱码问题
ccbikai
2014-05-18 20:05:14 +08:00
python 的 BeautiSoup 做这个正好
ETiV
2014-05-18 20:09:49 +08:00
YQL, Yahoo 的通用性抓取引擎.

抓 cnbeta 首页新闻标题:

select * from data.html.cssselect where url="http://www.cnbeta.com/" and css=".items_area dt a";

{
"a": [
{
"href": "/articles/293077.htm",
"target": "_blank",
"content": "可打电话 三星巨屏7英寸手机平板Galaxy W现身"
},
{
"href": "/articles/293075.htm",
"target": "_blank",
"content": "苹果收购Beats的真正目的:点缀iWatch"
},
{
"href": "/articles/293073.htm",
"target": "_blank",
"content": "Android和iOS应该如何向对方学习?"
},
...
]
}
ericls
2014-05-18 20:28:27 +08:00
这是一个很古老的问题 我看过一些文章
看到快去傅立叶变换我就关了。。。
楼主可以搜索 connect extraction
thanksir
2014-05-18 23:29:40 +08:00
pyquery
shoumu
2014-05-18 23:31:07 +08:00
xpath吧
zzNucker
2014-05-19 00:02:59 +08:00
@pythonee 乱码问题没有啊,显示乱码一般是字体原因导致的。
ybh37
2014-05-19 08:21:07 +08:00
看了一下,pyquery PhantomJS都不错,自己写也未尝不可。
pythonee
2014-05-19 09:32:30 +08:00
@ETiV 这个厉害了
looly
2014-05-19 10:07:05 +08:00
一般两种方式:
1、如果是非文章类可以XPath方式获取节点内的内容或者直接用正则
2、如果文字很多可以考虑基于区块的正文识别来获得正文,可以在github上看下cx-extractor这个项目。
imn1
2014-05-19 14:04:22 +08:00
不同站点的通用很难写的,我自写在用的,把过程提取出来作为模块,但也是每站点一堆参数,目前也就几十个站点,把参数写好,只要该网站不改版,下次还能用,改版了就要重写一次参数
当然不少站点的参数都类似,不同仅仅在正则,例如瀑布流ajax可以写成一个模板,不同站点的瀑布流就改改提交获取json路径就可以了,又如有些站点是第1页~第N页,也可以写个递增模板,不同的应用只需填入最后的页数和路径就行

目前遇到最难的是用js计算路径的,暂时不懂也不太想调用外部的js引擎,主要不是难,而是耗资源,算上万网页就是个问题

能用正则就尽量用正则,xpath因为要导入一个dom树,单个页面会比正则多消耗20%的时间,如果页面过万,可能就是倍数而不仅是20%~
ericls
2014-05-19 21:59:50 +08:00
突然发现我上面的写错了 是content extraction ..
missdeer
2014-05-20 11:22:13 +08:00
抓正文网上有各种语言实现的readability代码,抓其他元素的感觉XPath可以试试
RangerWolf
2014-05-20 22:04:38 +08:00
@imn1 如果是css selector的方式呢? 之前看了一本书说css选择器的效率还不错
另外 20%是你估算的还是有测试数据支撑?
imn1
2014-05-23 15:46:37 +08:00
@RangerWolf 实际工作的测试,约5000个html,py3,纯parse,无下载过程(用wget另外下载的,不在程序内),除了用正则regex和lxml+xpath三行代码不同外,其他语句一样,单线程,无协程,CPU是老机器T2390,如果快点的CPU可能没那么明显
美丽汤4的css selector比lxml还要慢,这个老早有洋人测试过了,google一下,个人觉得只要载入DOM树,肯定要占资源多些的,理论上是这样,不过dom比较容易定位找到目标,正则要准确定位就要需要技巧,尤其是排除型正则比较难写

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

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

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

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

© 2021 V2EX