我想写一个webscraper来收集Medium.com网页上的文章标题。
我正在尝试编写一个Python脚本,该脚本将删除Medium.com网站上的标题。我正在使用python 3.7,并从urlopen
导入了urllib.request
。
但是它无法打开网站并显示
"urllib.error.HTTPError: HTTP Error 403: Forbidden" error.
from bs4 import BeautifulSoup
from urllib.request import urlopen
webAdd = urlopen("https://medium.com/")
bsObj = BeautifulSoup(webAdd.read())
Result = urllib.error.HTTPError: HTTP Error 403: Forbidden
预期结果是它不会显示任何错误,而只是阅读网站。
但这在我使用请求模块时不会发生。
import requests
from bs4 import BeautifulSoup
url = 'https://medium.com/'
response = requests.get(url, timeout=5)
这次可以正常工作了。
为什么??
答案 0 :(得分:2)
Urllib是相当古老的小型模块。对于网络抓取,建议使用requests
模块。
You can check out this answer for additional information.
答案 1 :(得分:2)
如今,许多站点都在检查用户代理的来源,以试图阻止机器人。 requests
是更好的模块,但是如果您真的想使用urllib
,则可以更改标头文本,以假装为Firefox或其他名称,从而不会被阻止。快速示例可以在这里找到:
https://stackoverflow.com/a/16187955
import urllib.request
user_agent = 'Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion'
url = "http://example.com"
request = urllib.request.Request(url)
request.add_header('User-Agent', user_agent)
response = urllib.request.urlopen(request)
您还需要使用适当版本的东西来更改user_agent字符串。希望这会有所帮助。
答案 2 :(得分:0)
这对我有用
import urllib
from urllib.request import urlopen
html = urlopen(MY_URL)
contents = html.read()
print(contents)