use*_*624 5 python web-crawler web-scraping python-requests
我试图从seekingalpha.com上抓一些文章.但是,经过一定数量的刮擦后,会出现验证码.(即https://seekingalpha.com/article/4230872-dillards-still-room-downside)
但是,我遇到了重大问题.
我from fake_useragent import UserAgent用来随机化我的标题.
我在请求之间使用随机休眠时间
一旦出现验证码,我将使用VPN更改IP地址.但是,一旦我的IP地址出现,某种方式仍然会出现验证码.
这也很奇怪,因为当请求响应中出现验证码时,验证码不会出现在浏览器中.
所以,我认为通过标题是错误的.
我在获取此请求时关闭了js和cookies,因为有了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
}
Run Code Online (Sandbox Code Playgroud)
这与网站使用的内容很接近:他们补充道
"cache-control": "max-age=0",
"if-none-match": 'W/"6f11a6f9219176fda72f3cf44b0a2059"',
Run Code Online (Sandbox Code Playgroud)
这对我的研究是etags,用于carching,可用于跟踪人.'W/...'每个请求的更改.
此外,当我使用wkhtmltopdf将屏幕打印为pdf时,我从未出现过验证码.我也尝试过使用硒,这更糟糕.另外,我一直在使用代理所看到试图在这里.
所以肯定有办法做到这一点.但是,我没有正确地做到这一点.有谁知道我做错了什么?
编辑:1.会话似乎不起作用
随机标题似乎不起作用
随机睡眠似乎不起作用
我可以使用VPN访问网页.甚至一旦capcha出现使用请求,浏览器中的网站上就没有验证码.
硒不起作用.
我真的不想支付解决问题的服务费用.
我认为问题在于我不能很好地模仿浏览器.
使用FIREFOX和SESSIONS后的代码:
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
Run Code Online (Sandbox Code Playgroud)
查明被屏蔽并面临验证码的确切原因并不容易。以下是一些想法:
有时,验证码服务(在本例中为 Google)可能会将常见 VPN IP 地址列入黑名单,并将其视为潜在威胁,因为许多人正在使用它们并且它们会产生大量流量。
有时,代理服务器(尤其是免费的)不是匿名的,可以在请求标头(特别是X-Forwarded-For标头)中发送您的实际 IP 地址
您的请求中包含某些非常重要的标头。让您的请求看起来合法的最简单方法是使用浏览器“开发人员工具”中的“网络”选项卡,并复制浏览器发送的所有标头。
一个重要的标头是referer. 虽然网站可能会或可能不会检查它,但将其与网站页面(或主页)之一的 URL 放在一起会更安全:
referer: https://seekingalpha.com/
Run Code Online (Sandbox Code Playgroud)
尝试增加请求之间的超时时间。几秒钟应该是合理的。
最后,尝试使用session中的对象requests。它们自动维护 cookie 并referer在多个请求中更新 cookie,以模拟真实用户浏览网站。我发现它们在克服抓取保护方面最有帮助。
最后的手段是使用服务来破解验证码。有许多在线服务(大部分是付费的)可以做到这一点。一种流行的方法是 DeathByCaptcha。请记住,您可能会违反网站的使用条款,我不建议这样做:)
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |