Web Scraping 使用 urllib 获取错误(HTTP 错误 403:禁止访问)

Web Scraping getting error (HTTP Error 403: Forbidden) using urllib

我正在尝试对 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,但这并不是 return 整个文本。 还有其他我们可以遵循的方法吗?

您无需向此请求添加任何 headers。 试试这个

import requests

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

我在使用 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)