最近在学习Python,尝试爬一些站,发现有些站并不好爬,不是因为分页问题,这个还算好迭代。下面列举一下:
1、某些站正文内容是用<p></p>这种方法把一段文字分成几行,另外图片和时间的字段也是用<p></p>装饰,正则不会写。
2、爬站的时候虽然用单线程,但明显感觉到网站对于爬虫有一个访问限制,爬一页需要的时间居然很固定在10秒左右。
3、单线程下爬完一页应该上传到我的远程数据库,但如果遇到上传过程中产生错误或者异常,那么一页爬的数据并没有全部上传完毕,这时候用多线程就麻烦了,很可能不清楚上传进度,单线程下因为异常退出没有办法做到全自动。
想请教一下高手怎么破啊,这些问题。
1
wuhang89 2014-12-30 11:21:08 +08:00 1
你需要解析HTML库BeautifulSoup,易于使用的http链接库requests,貌似你程序架构设计有问题,但是你没有列举清楚,所以无法帮助你。
|
2
XadillaX 2014-12-30 11:41:53 +08:00 1
用 PyQuery 吧。
|
3
LINAICAI OP @wuhang89
# <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> 比如上面这段,应该怎样写正则? 图片URL和正文什么的用几个<p></p>拼凑的 |
6
LINAICAI OP 真的想知道 为什么有这么写的站。。。
这个是为了反爬做的措施吗 |
7
wuhang89 2014-12-30 13:53:06 +08:00 3
都叫你看看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 灯条,完美的隐藏在灯架内。... |
9
herozzm 2014-12-30 15:21:32 +08:00 1
先学正则,再学爬虫
|
10
Melodic 2014-12-30 15:32:37 +08:00
xpath的一个函数叫做descendant,可以获取该标签下的所有子节点
|
12
wilbeibi 2014-12-30 17:29:20 +08:00
用lxml吧~
|
13
MasterYoda 2014-12-30 17:43:44 +08:00
xpath嘛
|
14
pandada8 2014-12-30 17:44:49 +08:00
网页爬虫就不要用正则写吧,除非是非常有规律的网页。
|
16
KentY 2014-12-30 17:59:47 +08:00
我不常弄爬虫,但是前端时间在抓一些网上资源的时候遇到一个比较棘手的是人家服务器ban你ip请求,如果你请求过频。 这个目前是先去别的代理网站抓个代理列表,轮着爬该服务器,但是代理质量又不好保证, 又要随爬随清理,然后不够了再抓一票代理。。。 这个烦人
|
17
iannil 2014-12-30 18:40:30 +08:00
如果是抓标题+内容这种东西的话,还是有办法的。
标题很好拿,一个正则就搞定了,正文的话,可以把html拿到以后,逐行读取,然后获取每行的长度,基本上整个html页长度最长的行的组合就是正文。 然后自己在做一些针对目标网站的判断,就可以把比较干净的正文摘出来了。 |
18
binux 2014-12-30 18:43:51 +08:00
|
20
alexapollo 2014-12-30 19:33:09 +08:00
|
22
herozzm 2014-12-30 21:41:09 +08:00
也可以用xpath和css selector
|
23
pandada8 2014-12-30 22:12:33 +08:00
@herozzm 您老先去看了那篇stackoverflow的文章呗
我还真是第一次看到这样的说法…… 一般来说正则性能比xpath之流要好,性能消耗也少,但是对于复杂页面结构和复杂页面内容比较无力,同时并不通用,你可能需要随时修改正则 xpath 与 css selector 倒是显得比较通用,再加上beautifulsoup这种库的傻瓜化封装使用较为方便,但是由于要解析html,开销反而倒是比较大 |
24
mengskysama 2014-12-30 22:25:41 +08:00
BS4确实是好东西,开销大不是开玩笑,而且有些不标准的html页面比如遇到没有进行正确转义bs4会解析出错,如果工作量很大可以考虑lxml要快要快一些。
前端限制频率的话在前面加个GAE就行了,遇到错误重试,GAE出口是'随机'好几十个。 第三个问题明显是设计缺陷。 |
28
pandada8 2014-12-30 22:38:59 +08:00
|
30
fewspider 2014-12-31 00:31:53 +08:00 via Android 1
1、beautifulsoup可以搞定,找到那个节点后,text就是内容了
2、10秒左右,这明显是网速,打开一个页面,加载那些数据,这些都需要时间,不是站点限制你访问 3、可以try exception一下,把需要的数据整理一下,判断是否为空,不为空再去调数据库插入 |
31
beverse 2014-12-31 00:43:49 +08:00 via Android
|
34
doumeki 2014-12-31 16:19:05 +08:00
BS4注意,之前用过,发现不能很好处理如<br>这样的自闭代码。当然如果Hack也简单,也就一句话的事。lxml也试过,不明原因的运行中每次输出的结果都不一至,估计也是<br><br>这类导致的
|