【问题标题】:Web Scraping getting error (HTTP Error 403: Forbidden) using urllib使用 urllib 的 Web Scraping 出现错误(HTTP 错误 403:禁止)
【发布时间】:2021-10-10 09:21:33
【问题描述】:

我正在尝试自动对 SEC / EDGAR 财务报告进行网络抓取,但收到 HTTP 错误 403:禁止。我参考了类似的 Stack Overflow 表单并相应地更改了代码,但到目前为止还没有运气。

test_URL = https://www.sec.gov/Archives/edgar/data/3662/0000950170-98-000413.txt

我正在使用的代码

import urllib

def get_data(link):
    hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
       'Accept-Encoding': 'none',
       'Accept-Language': 'en-US,en;q=0.8',
       'Connection': 'keep-alive'}

    req = urllib.request.Request(link,headers=hdr)
    
    page = urllib.request.urlopen(req, timeout=10)
    content = page.read().decode('utf-8')
  
    return content

data = get_data(test_URL)

得到错误

HTTPError                                 Traceback (most recent call last)
             return result

~\Anaconda3n\lib\urllib\request.py in http_error_default(self, req, fp, code, msg, hdrs)
    647 class HTTPDefaultErrorHandler(BaseHandler):
    648     def http_error_default(self, req, fp, code, msg, hdrs):
--> 649         raise HTTPError(req.full_url, code, msg, hdrs, fp)
    650 
    651 class HTTPRedirectHandler(BaseHandler):

HTTPError: HTTP Error 403: Forbidden

我也尝试过使用 requests.get(test_URL) 然后使用 BeautifulSoup,但这不会返回整个文本。 还有其他我们可以遵循的方法吗?

【问题讨论】:

  • 您之前是否成功处理过此请求?有时网站会在发出大量请求后阻止 IP。
  • 第一次,它工作,但之后,我得到的只是这个错误

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


【解决方案1】:

我没有使用request 包的问题。我确实需要添加用户代理,因为我遇到了和你一样的问题。试试这个:

import requests 

test_URL = 'https://www.sec.gov/Archives/edgar/data/3662/0000950170-98-000413.txt'

def get_data(link):
    hdr = {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Mobile Safari/537.36'}

    req = requests.get(link,headers=hdr)
    content = req.content
  
    return content

data = get_data(test_URL)

【讨论】:

    【解决方案2】:

    您无需为此请求添加任何标头。 试试这个

    import requests
    
    r = requests.get('https://www.sec.gov/Archives/edgar/data/3662/0000950170-98-000413.txt')
    print(r.text)
    

    【讨论】:

    • 不一定是这样。
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 2018-01-03
    • 2011-07-12
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2013-07-19
    相关资源
    最近更新 更多