我试图从Google财经中删除一些数据'网站作为使用Python 3.6.2的实践。这是代码:
import urllib.request
url="https://www.google.com/search?num=40&newwindow=1&tbm=fin&q="
stockName=input("The stock you want to search for:")
url=url+stockName
url="https://www.google.com/search?num=40&newwindow=1&tbm=fin&q=FB"
data=urllib.request.urlopen(url).read()`
但我一直收到HTTP错误403。 我得到的错误是这样的:
Traceback (most recent call last):
File "<pyshell#101>", line 1, in <module>
data=urllib.request.urlopen(url).read()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 532, in open
response = meth(req, response)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 564, in error
result = self._call_chain(*args)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 756, in http_error_302
return self.parent.open(new, timeout=req.timeout)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 532, in open
response = meth(req, response)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 570, in error
return self._call_chain(*args)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
我该怎么办?在此之前,我收到了SSL证书错误,但由于在此论坛中找到了答案,因此解决了这个问题。
答案 0 :(得分:0)
有些网站不一定支持无头抓取,无论是由于缺少正确的标头还是缺少JS支持来防止机器人。它将返回403状态或除您预期之外的其他内容。我对urllib
的评论不够熟悉,但是当我使用requests
模块进行评论时,它似乎有效。
import requests
res = requests.get("https://www.google.com/search?num=40&newwindow=1&tbm=fin&q=FB")
res.raise_for_status()
# No status raised
您可能还想尝试urllib2
。我提到的两个图书馆都需要从pip
安装。
存在urllib
的解决方案。您需要手动添加标头。我个人使用fake_useragent
库(再次从pip安装)来欺骗标题:
from fake_useragent import UserAgent
from urllib import request
ua = UserAgent()
req = request.Request("https://www.google.com/search?num=40&newwindow=1&tbm=fin&q=FB")
req.add_header('User-Agent', ua.chrome)
data = request.urlopen(req)
如果您足够熟悉,可以在不使用fake_useragent
的情况下设置自己的用户代理字符串。在这种情况下,只需用您的User-Agent字符串替换ua.chrome
部分。正如您所看到的那样,requests
在这种情况下甚至不需要标题即可工作 - 如果您正在努力提高您的技能,那么这是一个可行的选择,可能会在将来为您节省一些麻烦。
修改:添加我的个人经验。我发现调试这些问题的一个好方法是保存代码检索到的页面,并将其与您在实际浏览器中看到的页面进行比较。通过这种方式,您可以知道某些内容是否由JS驱动(因此无法通过简单的刮擦进行解析),或者您是否收到完全不同的内容(这意味着您的废料缺少页面所期望的某些元素,例如标题或JS支持)。