关于爬虫的一些问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
LINAICAI

关于爬虫的一些问题

  •  
  •   LINAICAI Dec 30, 2014 5068 views
    This topic created in 4135 days ago, the information mentioned may be changed or developed.

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

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

    35 replies    2015-01-02 15:57:45 +08:00
    wuhang89
        1
    wuhang89  
       Dec 30, 2014   1
    你需要解析HTML库BeautifulSoup,易于使用的http链接库requests,貌似你程序架构设计有问题,但是你没有列举清楚,所以无法帮助你。
    XadillaX
        2
    XadillaX  
       Dec 30, 2014   1
    用 PyQuery 吧。
    LINAICAI
        3
    LINAICAI  
    OP
       Dec 30, 2014
    @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
        4
    kchum  
       Dec 30, 2014   1
    @LINAICAI 你需要给多几个数据,才可以判断。例如第一个 p 都是图片?或者外面的那层 div 就是一个正文容器
    LINAICAI
        5
    LINAICAI  
    OP
       Dec 30, 2014
    @kchum 是的,第一个p都是图片 后面正文的是不定数目的p段
    LINAICAI
        6
    LINAICAI  
    OP
       Dec 30, 2014
    真的想知道 为什么有这么写的站。。。
    这个是为了反爬做的措施吗
    wuhang89
        7
    wuhang89  
       Dec 30, 2014   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 灯条,完美的隐藏在灯架内。...
    LINAICAI
        8
    LINAICAI  
    OP
       Dec 30, 2014
    @wuhang89 太!
    herozzm
        9
    herozzm  
       Dec 30, 2014   1
    先学正则,再学爬虫
    Melodic
        10
    Melodic  
       Dec 30, 2014
    xpath的一个函数叫做descendant,可以获取该标签下的所有子节点
    LINAICAI
        11
    LINAICAI  
    OP
       Dec 30, 2014
    @herozzm 看一次用一次下次用忘记了。。。
    wilbeibi
        12
    wilbeibi  
       Dec 30, 2014
    用lxml吧~
    MasterYoda
        13
    MasterYoda  
       Dec 30, 2014
    xpath嘛
    pandada8
        14
    pandada8  
       Dec 30, 2014
    网页爬虫就不要用正则写吧,除非是非常有规律的网页。
    herozzm
        15
    herozzm  
       Dec 30, 2014
    @pandada8 正则适用所有情况
    KentY
        16
    KentY  
       Dec 30, 2014
    我不常弄爬虫,但是前端时间在抓一些网上资源的时候遇到一个比较棘手的是人家服务器ban你ip请求,如果你请求过频。 这个目前是先去别的代理网站抓个代理列表,轮着爬该服务器,但是代理质量又不好保证, 又要随爬随清理,然后不够了再抓一票代理。。。 这个烦人
    iannil
        17
    iannil  
       Dec 30, 2014
    如果是抓标题+内容这种东西的话,还是有办法的。
    标题很好拿,一个正则就搞定了,正文的话,可以把html拿到以后,逐行读取,然后获取每行的长度,基本上整个html页长度最长的行的组合就是正文。
    然后自己在做一些针对目标网站的判断,就可以把比较干净的正文摘出来了。
    pandada8
        19
    pandada8  
       Dec 30, 2014
    @herozzm ...
    alexapollo
        20
    alexapollo  
       Dec 30, 2014
    herozzm
        21
    herozzm  
       Dec 30, 2014
    @pandada8
    @binux
    正则应该是比较通用的选择吧,不管你用的是python还是golang,只是性能消耗较大
    herozzm
        22
    herozzm  
       Dec 30, 2014
    也可以用xpath和css selector
    pandada8
        23
    pandada8  
       Dec 30, 2014
    @herozzm 您老先去看了那篇stackoverflow的文章呗
    我还真是第一次看到这样的说法……
    一般来说正则性能比xpath之流要好,性能消耗也少,但是对于复杂页面结构和复杂页面内容比较无力,同时并不通用,你可能需要随时修改正则
    xpath 与 css selector 倒是显得比较通用,再加上beautifulsoup这种库的傻瓜化封装使用较为方便,但是由于要解析html,开销反而倒是比较大
    mengskysama
        24
    mengskysama  
       Dec 30, 2014
    BS4确实是好东西,开销大不是开玩笑,而且有些不标准的html页面比如遇到没有进行正确转义bs4会解析出错,如果工作量很大可以考虑lxml要快要快一些。

    前端限制频率的话在前面加个GAE就行了,遇到错误重试,GAE出口是'随机'好几十个。

    第三个问题明显是设计缺陷。
    herozzm
        25
    herozzm  
       Dec 30, 2014
    @pandada8 我说正则比较通用是指的这种方式,并不是说具体匹配的写法通用,用了正则,肯定是每个页面得单独写正则
    pandada8
        26
    pandada8  
       Dec 30, 2014
    @herozzm 常见的语言应该也都不缺HTML解析的库
    herozzm
        27
    herozzm  
       Dec 30, 2014
    @pandada8 php似乎就没有,得上正则吧?
    pandada8
        28
    pandada8  
       Dec 30, 2014
    herozzm
        29
    herozzm  
       Dec 30, 2014
    @pandada8 孤陋寡闻了
    fewspider
        30
    fewspider  
       Dec 31, 2014 via Android   1
    1、beautifulsoup可以搞定,找到那个节点后,text就是内容了
    2、10秒左右,这明显是网速,打开一个页面,加载那些数据,这些都需要时间,不是站点限制你访问
    3、可以try exception一下,把需要的数据整理一下,判断是否为空,不为空再去调数据库插入
    beverse
        31
    beverse  
       Dec 31, 2014 via Android
    我也刚学,完全用正则,你可以看看:codejob.me

    解析很容易的,关键在于稳定把网页下载下来。
    LINAICAI
        32
    LINAICAI  
    OP
       Dec 31, 2014
    @fewspider
    1、新人一个确实不知道这个利器
    2、但我访问其他站甚至爬另外一个站确实比这个快的多
    fewspider
        33
    fewspider  
       Dec 31, 2014 via Android
    @LINAICAI 你可以ping一下这个站跟其他站的速度
    doumeki
        34
    doumeki  
       Dec 31, 2014
    BS4注意,之前用过,发现不能很好处理如<br>这样的自闭代码。当然如果Hack也简单,也就一句话的事。lxml也试过,不明原因的运行中每次输出的结果都不一至,估计也是<br><br>这类导致的
    LINAICAI
        35
    LINAICAI  
    OP
       Jan 2, 2015
    @wuhang89
    <p><img src="images/n_shiye.gif" width="151" height="268" align="left" />XXX</p>

    这个怎么获取XXX的内容,用beautifulsoup。
    soup.find('omg', {'align' : 'left'})貌似获取的只有XXX前面的标签啊。
    About     Help     Advertise     Blog     API     FAQ     Solana     982 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 97ms UTC 22:51 PVG 06:51 LAX 15:51 JFK 18:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86