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

时间:2017-09-19 15:44:04

标签: r web-scraping web-crawler captcha httr

我正在尝试使用httrrvest从此website抓取数据。经过几次刮刮(大约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。
  3. 感谢。

    这是我的代码:

    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()
    

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

1 个答案:

答案 0 :(得分:1)

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

您可以通过使用以下参数进行操作来避免获取CAPTCHA。所以你的程序看起来就像一个真正的用户:

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

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

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

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