• 爬虫遇到网页拦截肿么办


    本人学爬虫一段时间,爬的都是简单的网页。但突然有一天爬网页被拦截,不知如何是好,问度娘上百次,总结了一下经验

    在访问网页的时候被拦截,封你的IP,登录验证等手段不让爬客们得逞,但是道高一尺,魔高一丈。我开始研习突破反爬虫限制的功法

    1.伪装流浪器报头

          很多服务器通过浏览器发给它的报头来确认是否是人类用户,所以我们可以通过模仿浏览器的行为构造请求报头给服务器发送请求。服务器会识别其中的一些参数来识别你是否是人类用户,很多网站都会识别User-Agent这个参数,所以请求头最好带上。有一些警觉性比较高的网站可能还会通过其他参数识别,比如通过Accept-Language来辨别你是否是人类用户,一些有防盗链功能的网站还得带上referer这个参数等等。

          2.随机生成UA

          只需带User-Agent这个参数就可以抓取页面信息了,不过连续抓取几页就被服务器阻止了。于是决定每次抓取数据时模拟不同的浏览器发送请求,而服务器通过User-Agent来识别不同浏览器,所以每次爬取页面可以通过随机生成不同的UA构造报头去请求服务器,

          3.减慢爬取速度

          虽然模拟了不同浏览器爬取数据,但发现有的时间段可以爬取上百页的数据,有时候却只能爬取十来页,看来服务器还会根据你的访问的频率来识别你是人类用户还是网络爬虫。所以我每抓取一页都让它随机休息几秒,加入此句代码后,每个时间段都能爬取大量股票数据了。

          4.使用代理IP

          天有不测风云,程序在公司时顺利测试成功,回寝室后发现又只能抓取几页就被服务器阻止了。惊慌失措的我赶紧询问度娘,获知服务器可以识别你的IP,并记录此IP访问的次数,可以使用高匿的代理IP,并在抓取的过程中不断的更换,让服务器无法找出谁是真凶。此功还未修成,欲知后事如何,请听下回分解。

          5.其他突破反爬虫限制的方法

          很多服务器在接受浏览器请求时会发送一个cookie文件给浏览器,然后通过cookie来跟踪你的访问过程,为了不让服务器识别出你是爬虫,建议最好带上cookie一起去爬取数据;如果遇上要模拟登陆的网站,为了不让自己的账号被拉黑,可以申请大量的账号,然后再爬入,此处涉及模拟登陆、验证码识别等知识,暂时不再深究...总之,对于网站主人来说,有些爬虫确实是令人讨厌的,所以会想出很多方法限制爬虫的进入,所以我们在强行进入之后也得注意些礼仪,别把人家的网站给拖垮了。

    举个登录知乎的代码例子:

    #encoding:utf8
    import requests
    from lxml import etree
    import re
    dai = ['175.155.25.20:808'] #代理ip
    head = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"} #头的信息

    cookie = {'Cookie':'q_c1=42980743158c4aab9d8111f90172ec69|1490747011000|1490747011000; r_cap_id="ZTIxNTU3YWE3NjNmNDY1YmI1NDc2ZTFkZWM4ZWYyNDI=|1493277797|377fb0c22c8ac4f0dd192742d2c7e74f876f4b1b"; cap_id="ZjIwM2NlYTJhOWNiNDIxZjg0NDBkYzEyNTZlZTk3ZWM=|1493277797|cc27229fb1908723c6a19c8acc8f83fc181770a4"; capsion_ticket="2|1:0|10:1492830337|14:capsion_ticket|44:MjJiMTFmNjNlZTVlNDdmMjk3YzAxNjZmMzkwMjkyYmQ=|cfc0184334508f233cda25a1549f9ab8ff3abd2bcde0eb00d57d561b3d37da71"; aliyungf_tc=AQAAAKV5ZgOXbQsAAtD5cpIi0/Ex8fux; acw_tc=AQAAAOfo2CFxJQ0AAtD5cms3yXOcEGH+; _xsrf=aec21e958db4d4c03ed5ba3245ce3eca; d_c0="AJACY2OmqwuPTikw3aZFLtfreGDGHsZiGRw=|1493277794"; l_n_c=1; __utma=51854390.267103839.1493278142.1493278142.1493278142.1; __utmb=51854390.0.10.1493278142; __utmc=51854390; __utmz=51854390.1493278142.1.1.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmv=51854390.000--|3=entry_date=20170329=1; _zap=dbcdd0ce-8192-4652-a8b0-dc163795627b; z_c0=Mi4wQUNBQ2R4Umlxd3NBa0FKalk2YXJDeGNBQUFCaEFsVk45Q2twV1FEMmF2aVlHeFpSNlE4bE15YnFyU2xfT0Z2cE1R|1493277941|74ef22a4df0a689b9eb43adcba977aebd9d165e5'}

    te = requests.get('https://www.zhihu.com/#signin',cookies=cookie,headers=head,proxies=dai).text
    demo = re.compile('<span class="Guide-BioEditorBio">(.*?)</span>',re.S)
    aa = demo.findall(te)
    print(aa)
  • 相关阅读:
    Eclipse 的快捷键
    using的用法
    二进制、八进制、十进制、十六进制之间的转换
    解决重置PostgreSQL 9.6密码的问题
    byte[]数组和int之间的转换
    【2021】IOS技术 UITableViewCell分割线无留白技巧
    【2021】IOS技术:属性观察器(Property Observers)倒计时实现
    【2019】问题记录一:后端获取URL参数的值内加号“+”变成空格“ ”
    【2015】对面向对象的理解
    “退格键”(Backspace)你想退到哪里?比较含退格的字符串
  • 原文地址:https://www.cnblogs.com/GUIDAO/p/6780345.html
Copyright © 2020-2023  润新知