使用R进行网页抓取时如何处理验证码

ran*_*rst 5 captcha r web-crawler web-scraping httr

我试图从这个网站上抓取数据,使用httrrvest。经过多次抓取(大约 90 - 100 次),该网站会自动将我转移到另一个带有验证码的网址。

这是正常的网址: "https://fs.lianjia.com/ershoufang/pg1"

这是验证码网址: "http://captcha.lianjia.com/?redirect=http%3A%2F%2Ffs.lianjia.com%2Fershoufang%2Fpg1"

当我的蜘蛛遇到验证码网址时,它会告诉我停止并在浏览器中解决它。然后我在浏览器中手动解决它。但是当我运行蜘蛛并发送GET请求时,蜘蛛仍然被转移到验证码网址。同时在浏览器中,一切正常,即使我输入验证码网址,它也会将我转回浏览器中的正常网址。

即使我使用代理,我仍然遇到同样的问题。在浏览器中,我可以正常浏览网站,而蜘蛛一直在转移到验证码网址。

我想知道,

  1. 我使用代理的方式正确吗?
  2. 为什么蜘蛛不断被传输而浏览器没有。他们来自同一个IP。

谢谢。

这是我的代码:

a <- GET(url, use_proxy(proxy, port), timeout(10),
          add_headers('User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
                      'Connection' = 'keep-alive',
                      'Accept-Language' = 'en-GB,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,en-US;q=0.2,fr;q=0.2,zh-TW;q=0.2',
                      'Accept-Encoding' = 'gzip, deflate, br',
                      'Host' = 'ajax.api.lianjia.com',
                      'Accept' = '*/*',
                      'Accept-Charset' = 'GBK,utf-8;q=0.7,*;q=0.3',
                      'Cache-Control' = 'max-age=0'))
b <- a %>% read_html %>% html_nodes('div.leftContent') %>% html_nodes('div.info.clear') %>% 
            html_nodes('div.title') %>% html_text()
Run Code Online (Sandbox Code Playgroud)

最后,我转向了 RSelenium,它很慢但没有更多的验证码。即使出现,我也可以直接在浏览器中解决。

San*_*osh 3

您收到验证码是因为这是网站试图防止非人类/编程脚本废弃其数据的方式。因此,当您尝试抓取数据时,它会将您检测为非人类/机器人脚本。发生这种情况的原因是您的脚本发送非常频繁的 GET 请求以及一些参数数据。您的程序需要像真实用户一样运行(以随机时间模式、不同的浏览器和 IP 访问网站)。

您可以通过如下操作这些参数来避免获取验证码。所以你的程序看起来就像一个真正的用户:

  1. 发送 GET 请求时使用随机性。就像您可以在发送每个 GET 请求之前使用Sys.sleep函数(使用随机分布)休眠一样。

  2. 操作用户代理数据(Mozilla、Chrome、IE 等)、cookie 接受和编码。

  3. 操纵您的源位置(IP 地址和服务器信息)

操纵这些信息将帮助您避免以某种方式获得验证码验证。