关于爬虫的一些问题

2014-12-30 10:55:05 +08:00
 LINAICAI

最近在学习Python,尝试爬一些站,发现有些站并不好爬,不是因为分页问题,这个还算好迭代。下面列举一下:
1、某些站正文内容是用<p></p>这种方法把一段文字分成几行,另外图片和时间的字段也是用<p></p>装饰,正则不会写。
2、爬站的时候虽然用单线程,但明显感觉到网站对于爬虫有一个访问限制,爬一页需要的时间居然很固定在10秒左右。
3、单线程下爬完一页应该上传到我的远程数据库,但如果遇到上传过程中产生错误或者异常,那么一页爬的数据并没有全部上传完毕,这时候用多线程就麻烦了,很可能不清楚上传进度,单线程下因为异常退出没有办法做到全自动。

想请教一下高手怎么破啊,这些问题。

4195 次点击
所在节点    Python
35 条回复
wuhang89
2014-12-30 11:21:08 +08:00
你需要解析HTML库BeautifulSoup,易于使用的http链接库requests,貌似你程序架构设计有问题,但是你没有列举清楚,所以无法帮助你。
XadillaX
2014-12-30 11:41:53 +08:00
用 PyQuery 吧。
LINAICAI
2014-12-30 11:42:56 +08:00
@wuhang89
# <DIV class=align_entry_hack><p><img src="http://imgout.ph.126.net/39099091/molecula_lamp_02.jpg" alt="" /></p><p>&ldquo;Molecula&rdquo;是一个功能性灯具,它可以是台灯,也可以安装在墙壁的壁灯,它不仅仅是灯具,还是一个线条明快的雕塑。</p><p>&ldquo;Molecula&rdquo;白天可以是雕塑,装饰家居环境,晚上就是照明的灯具,内置超薄的LED 灯条,完美的隐藏在灯架内。...</p></DIV>
# <table width="97%" border="0" align="center" cellpadding="0" cellspacing="0" class="di">
# <tr>
# <td height="26" valign="top"><div align="left">j.lee 发表于 2014年12月16日</div></td>
# <td valign="top"><div align="right"><a href="http://www.qiqufaxian.cn/post/8055.html">详细阅读</a></div></td>
# </tr>
# </table>
# </DIV>


比如上面这段,应该怎样写正则?
图片URL和正文什么的用几个<p></p>拼凑的
kchum
2014-12-30 11:51:16 +08:00
@LINAICAI 你需要给多几个数据,才可以判断。例如第一个 p 都是图片?或者外面的那层 div 就是一个正文容器
LINAICAI
2014-12-30 11:55:46 +08:00
@kchum 是的,第一个p都是图片 后面正文的是不定数目的p段
LINAICAI
2014-12-30 11:57:31 +08:00
真的想知道 为什么有这么写的站。。。
这个是为了反爬做的措施吗
wuhang89
2014-12-30 13:53:06 +08:00
都叫你看看BeautifulSoup的文档了,做事情不要想当然的以为。
>>> from bs4 import BeautifulSoup
>>> html = '<DIV class=align_entry_hack><p><img src="http://imgout.ph.126.net/39099091/molecula_lamp_02.jpg" alt="" /> </p><p>“Molecula”是一个功能性灯具,它可以是台灯,也可以安装在墙壁的壁灯,它不仅仅是灯具,还是一个线条明快的雕塑。</p><p>“Molecula”白天可以是雕塑,装饰家居环境,晚上就是照明的灯具,内置超薄的LED 灯条, 完美的隐藏在灯架内。...</p></DIV><table width="97%" border="0" align="center" cellpadding="0" cellspacing="0" class="di"><tr><td height="26" valign="top"><div align="left">j.lee 发表于 2014年12月16日</div></td><td valign="top"><div align="right"><a href="http://www.qiqufaxian.cn/post/8055.html">详细阅读</a> </div></td></tr></table></DIV>'
>>> soup = BeautifulSoup(html)
>>> content = soup.find('div', {'class' : 'align_entry_hack'})
>>> print(content.text)
“Molecula”是一个功能性灯具,它可以是台灯,也可以安装在墙壁的壁灯,它不仅仅是灯具,还是一个线条明快的雕塑。“Molecula”白天可以是雕塑,装饰家居环境,晚上就是照明的灯具,内置超薄的LED 灯条,完美的隐藏在灯架内。...
LINAICAI
2014-12-30 14:48:13 +08:00
@wuhang89 太屌!
herozzm
2014-12-30 15:21:32 +08:00
先学正则,再学爬虫
Melodic
2014-12-30 15:32:37 +08:00
xpath的一个函数叫做descendant,可以获取该标签下的所有子节点
LINAICAI
2014-12-30 17:17:05 +08:00
@herozzm 看一次用一次下次用忘记了。。。
wilbeibi
2014-12-30 17:29:20 +08:00
用lxml吧~
MasterYoda
2014-12-30 17:43:44 +08:00
xpath嘛
pandada8
2014-12-30 17:44:49 +08:00
网页爬虫就不要用正则写吧,除非是非常有规律的网页。
herozzm
2014-12-30 17:53:58 +08:00
@pandada8 正则适用所有情况
KentY
2014-12-30 17:59:47 +08:00
我不常弄爬虫,但是前端时间在抓一些网上资源的时候遇到一个比较棘手的是人家服务器ban你ip请求,如果你请求过频。 这个目前是先去别的代理网站抓个代理列表,轮着爬该服务器,但是代理质量又不好保证, 又要随爬随清理,然后不够了再抓一票代理。。。 这个烦人
iannil
2014-12-30 18:40:30 +08:00
如果是抓标题+内容这种东西的话,还是有办法的。
标题很好拿,一个正则就搞定了,正文的话,可以把html拿到以后,逐行读取,然后获取每行的长度,基本上整个html页长度最长的行的组合就是正文。
然后自己在做一些针对目标网站的判断,就可以把比较干净的正文摘出来了。
binux
2014-12-30 18:43:51 +08:00
pandada8
2014-12-30 19:00:47 +08:00
@herozzm ...
alexapollo
2014-12-30 19:33:09 +08:00

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

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

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

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

© 2021 V2EX