【问题标题】:Error with Requests using Pandas/BeautifulSoup: requests.exceptions.TooManyRedirects: Exceeded 30 redirects使用 Pandas/BeautifulSoup 的请求出错:requests.exceptions.TooManyRedirects:超过 30 个重定向
【发布时间】:2018-01-22 19:01:33
【问题描述】:

我正在使用 Python 3 从包含 63,067 个网页的源 URL 的 csv 文件中抓取我创建的 Pandas 数据框。 for 循环应该从项目中抓取新闻文章,然后放入巨大的文本文件中以供稍后清理。

我对 Python 有点生疏了,这个项目是我重新开始用它编程的原因。我以前没有使用过 BeautifulSoup,所以我遇到了一些困难,只是让 for 循环使用 BeautifulSoup 处理 Pandas 数据框。

这是我正在使用的三个数据集之一(另外两个被编程到下面的代码中,以对不同的数据集重复相同的过程,这就是我提到这一点的原因)。

from bs4 import BeautifulSoup as BS
import requests, csv
import pandas as pd

negativedata = pd.read_csv('negativedata.csv')
positivedata = pd.read_csv('positivedata.csv')
neutraldata = pd.read_csv('neutraldata.csv')

negativedf = pd.DataFrame(negativedata)
positivedf = pd.DataFrame(positivedata)
neutraldf = pd.DataFrame(neutraldata)


negativeURLS = negativedf[['sourceURL']]

for link in negativeURLS.iterrows():
    url = link[1]['sourceURL']
    negative = requests.get(url)
    negative_content = negative.text

    negativesoup = BS(negative_content, "lxml")
    for text in negativesoup.find_all('a', href = True):
        text.append((text.get('href')))

我想我终于让我的 for 循环工作,让代码运行通过所有源 URL。但是,然后我得到错误:

Traceback (most recent call last):
  File "./datacollection.py", line 18, in <module>
    negative = requests.get(url)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 640, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 640, in <listcomp>
    history = [resp for resp in gen] if allow_redirects else []
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 140, in resolve_redirects
    raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp)
requests.exceptions.TooManyRedirects: Exceeded 30 redirects.

我知道问题出在我请求 URL 时,但由于数据框中的网页数量正在被迭代,我不确定是什么 - 或者是否是一个 URL 问题。问题是 URL 还是我的 URL 太多,应该使用像 scrapy 这样的不同包?

【问题讨论】:

    标签: python pandas web-scraping beautifulsoup python-requests


    【解决方案1】:

    我建议使用像 mechanize 这样的模块进行抓取。 Mechanize 有一种处理 robots.txt 的方法,如果您的应用程序从不同网站的 url 抓取数据,它会更好。但在您的情况下,重定向可能是因为此处提到的标题中没有用户代理(https://github.com/requests/requests/issues/3596)。以下是您如何设置带有请求的标头 (Sending "User-agent" using Requests library in Python)。

    P.S: mechanize 仅适用于 python2.x。如果您想使用 python3.x,还有其他选项 (Installing mechanize for python 3.4)。

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 2021-05-07
      • 1970-01-01
      • 2021-08-25
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2012-02-01
      相关资源
      最近更新 更多