即使更改标头和IP,验证码也会使用请求。如何跟踪我?

时间:2019-01-02 19:05:09

标签: python web-scraping python-requests web-crawler

我正在尝试从seekalpha.com中抓取一些文章。但是,经过一定数量的刮擦后,会出现一个验证码。 (即https://seekingalpha.com/article/4230872-dillards-still-room-downside

但是,我遇到了重大问题。

  1. 我正在使用from fake_useragent import UserAgent来随机化标题。

  2. 我在两次请求之间使用了随机睡眠时间

  3. 一旦出现验证码,我正在使用VPN更改IP地址。但是,一旦我的IP地址出现,验证码仍然会出现。

这也很奇怪,因为虽然验证码出现在请求响应中,但验证码没有出现在浏览器中。

所以,我认为by标头是错误的。

我在获取此请求时关闭了js和cookie,因为对于cookie和js,显然有网站跟踪我的信息。

headers = {
    "authority": "seekingalpha.com",
    "method": "GET",
    "path": "/article/4230872-dillards-still-room-downside",
    "scheme": "https",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": 'en-US,en;q=0.9',
    "upgrade-insecure-requests": "1",
    "user-agent": RANDOM
}

这与网站使用的内容很接近:它们会添加

"cache-control": "max-age=0",
"if-none-match": 'W/"6f11a6f9219176fda72f3cf44b0a2059"',

根据我的研究,这是etags,用于跟踪,可以用来追踪人。 'W/...'更改每个请求。

此外,当我使用wkhtmltopdf将屏幕打印为pdf时,我永远不会出现验证码。我也尝试过使用更糟糕的硒。此外,我尝试使用代理here

所以绝对有一种方法可以做到这一点。但是,我没有正确执行。有人知道我在做什么错吗?

编辑: 1.会话似乎不起作用

  1. 随机标头似乎不起作用

  2. 随机睡眠似乎无效

  3. 我可以使用我的VPN访问该网页。即使使用请求显示验证码,浏览器的网站上也没有验证码。

  4. 硒不起作用。

  5. 我真的不想为解决capcha的服务付费。

我认为问题在于我对浏览器的模仿不够充分。

使用FIREFOX和会话后的代码:

headers = {
"Host": "seekingalpha.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://seekingalpha.com/article/4230534-top-investment-idea-2019-8_4-percent-yield-huge-upside-brookfield",
"Connection": "keep-alive",
"Cookie": "machine_cookie=7303078485198; __utma=150447540.1851983007.1546469337.1546469337.1546469337.1; __utmb=150447540.12.9.1546469900508; __utmc=150447540; __utmz=150447540.1546469337.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; _igt=803cd9bc-cab1-4ebf-acf2-0f3e24cd4ab6; _pxvid=97da9aa0-0ee0-11e9-8dfa-3d4fb4091b16; _pxde=9ac7f544ed6bf87b3b17eab28485c874a9ec30af08c58bd06939e970333f9fb0:eyJ0aW1lc3RhbXAiOjE1NDY0Njk5MjMxNTl9; _fbp=fb.1.1546469337674.750013017; _px=jmSp9VoiTt+K7GfprDo2E0ESrv6B6oWW6aBWS80oMIv/ybegmmYZiH6d37Ko4xx1q8kzxUMBhDcjcagHc0sJ7g==:1000:caXByzVxpWn0yCp7pm7F4ZoS6opLJ4PpLAUY6hxyXg2qiKEisAvTpQ8McX4G5ki3KhR0mYSxP2lPzmBmsAHfT/tUDNQf6etMaeTHNeaI7/Bo57IdaZ0t8EVaoGN6JdT/37SKKCoj+wWhxwZT76R4GorL6HmG9zJoeNg4aq8AFpSaGRby+Y0oNFf+RGGNpyvPK/a7XFLpX2Wqil7C8NPGCMTMn9OP34oh7pQkIjNQADJh0LK+VooK4L8xeeEigO45tZfIZDoyo60T8yrZCeeVww==; _px2=eyJ1IjoiZTY3MzU3YTAtMGVlMS0xMWU5LWEwMTgtYTEzNmYxODA1MTRlIiwidiI6Ijk3ZGE5YWEwLTBlZTAtMTFlOS04ZGZhLTNkNGZiNDA5MWIxNiIsInQiOjE1NDY0NzA0MjMxNTksImgiOiJkN2ZmYmU1NDFiMTc2MmZiODE0NzMwMmRlNjVlMmU5OTcxMmE0YWNiOTkzODNkZTk3M2Q5Y2MxMTlhYjgzZTRiIn0=; h_px=1; __gads=ID=ec9252ba55729c81:T=1546469341:S=ALNI_MYXXw_CSX4n0nB6LlTDxgom1eFNMA; hsfirstvisit=; __hstc=234155329.06decc4a37bd788535f37984c1b06431.1546469363604.1546469363604.1546469363604.1; hubspotutk=06decc4a37bd788535f37984c1b06431; __hssrc=1; __hssc=234155329.5.1546469363604; cto_lwid=9fc606f8-a6da-4881-889a-2eee84855834; _pxff_tm=1; OX_plg=swf|shk|pm; _ig=d545d9b6-0d2b-4c3b-c8a0-4f63e21e7289; dmxRegion=false; _sasource=article_bottom_lift",
"Upgrade-Insecure-Requests": "1",
"TE": "Trailers"
}
def main():
    ua = UserAgent()
    count = 0
    file_writer("Run\n")
    collection_tracker("Run\n")
    session = requests.session()
    for link in links():
        headers["User-Agent"] = str(ua.random)
        r = session.get(link, headers = headers)
        soup = BeautifulSoup(r.content, "html5lib")
        print(soup)
        sleep(randint(1000,3000)/1000)
        file_writer(Header(soup).output()[0])
        collection_tracker(link +"\n")


        if count > 200:
            break
        count += 1

1 个答案:

答案 0 :(得分:2)

查明被阻止并面对验证码的确切原因并不容易。这里有几点想法:

VPN和代理

有时候, Captcha服务(在本例中为Google)可能会将通用VPN IP地址列入黑名单,并将其视为潜在威胁,因为许多人正在使用它们,并且产生大量流量。

有时,代理服务器(尤其是免费服务器)不是匿名,并且可以在请求标头(特别是X-Forwarded-For标头)中发送您的实际IP地址)

请求标头

在您的请求中有某些重要的标头。使请求看起来合法的最简单方法是使用浏览器“开发人员工具”中的“网络”标签,然后复制浏览器发送的所有标头。

要具有的重要标头 referer 。尽管网站可能会或可能不会对其进行检查,但将其与网站页面(或首页)之一的URL一起存放在其中比较安全:

referer: https://seekingalpha.com/

超时和会话

尝试在两次请求之间增加超时时间。几秒钟应该是合理的。

最后,尝试使用requests中的session个对象。他们自动维护cookie并在多个请求中更新referer,以模拟浏览网站的真实用户。我发现它们在克服刮擦保护方面最有用。

验证码

最后的手段是使用服务来破坏验证码。有许多在线服务(大多数是付费服务)可以做到这一点。流行的是DeathByCaptcha。请记住,您可能违反了网站的使用条款,我不建议您这样做:)