Selenium Webdriver / Beautifulsoup + Web Scraping + 错误 416

Posted

技术标签:

【中文标题】Selenium Webdriver / Beautifulsoup + Web Scraping + 错误 416【英文标题】:Selenium Webdriver / Beautifulsoup + Web Scraping + Error 416 【发布时间】:2015-12-20 17:11:12 【问题描述】:

我正在使用 Proxy 在 Python 中使用 selenium webdriver 进行网络抓取。

我想使用此抓取浏览超过 10k 的单个站点页面。

问题 正在使用此代理,我只能发送一次请求。当我在同一链接或此站点的另一个链接上发送另一个请求时,我收到 416 错误(使用防火墙的一种阻止 IP)1-2 小时。

注意:我可以用这段代码抓取所有正常的网站,但这个网站有一种安全性,阻止我抓取。

这是代码。

profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference(
                "network.proxy.http", "74.73.148.42")
profile.set_preference("network.proxy.http_port", 3128)
profile.update_preferences()
browser = webdriver.Firefox(firefox_profile=profile)
browser.get('http://www.example.com/')
time.sleep(5)
element = browser.find_elements_by_css_selector(
                '.well-sm:not(.mbn) .row .col-md-4 ul .fs-small a')
for ele in element:
    print ele.get_attribute('href')
browser.quit()

有什么办法吗??

【问题讨论】:

【参考方案1】:

Selenium 对我没有帮助,所以我通过使用 beautifulsoup 解决了这个问题,该网站在收到请求时使用安全性来阻止代理,所以每当服务器阻止请求时,我都会不断更改 proxyurl 和 User-Agent代理。

我在这里粘贴我的代码

from bs4 import BeautifulSoup
import requests
import urllib2

url = 'http://terriblewebsite.com/'

proxy = urllib2.ProxyHandler('http': '130.0.89.75:8080')

# Create an URL opener utilizing proxy
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
request = urllib2.Request(url)
request.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15')
result = urllib2.urlopen(request)
data = result.read()
soup = BeautifulSoup(data, 'html.parser')
ptag = soup.find('p', 'class', 'text-primary').text
print ptag

注意:

    更改代理和用户代理并仅使用最新更新的代理

    很少有服务器只接受特定国家的代理,就我而言,我使用的是来自美国的代理

这个过程可能很慢,但你仍然可以报废数据

【讨论】:

【参考方案2】:

查看以下链接中的 416 错误问题,似乎是某些缓存信息(可能是 cookie)造成了问题。您可以第一次发送请求,随后的发送请求失败。

https://webmasters.stackexchange.com/questions/17300/what-are-the-causes-of-a-416-error 416 Requested Range Not Satisfiable

尝试通过设置首选项或在每次发送请求后删除 cookie 来选择不保存 cookie。

profile.set_preference("network.cookie.cookieBehavior", 2);

【讨论】:

以上是关于Selenium Webdriver / Beautifulsoup + Web Scraping + 错误 416的主要内容,如果未能解决你的问题,请参考以下文章

Selenium Webdriver概述

appium的webdriver和selenium有啥区别?

selenium之python源码解读-webdriver继承关系

From  selenium  import  webdriver

Selenium WebDriver(Python)API

selenium+python - webdriver​模拟键盘ENTER没有效果