2018版Python urllib.request网页爬取脚本运行错误求助
解决urllib.request.urlopen访问网站时的报错问题
嘿,我看你这段网页抓取脚本踩坑了,咱们来一步步搞定它~
先看看你写的代码:
import bs4 as bs import urllib.request source = urllib.request.urlopen('https://pythonprogramming.net/parsememcparseface/').read() soup = bs.BeautifulSoup(source, 'lxml') print(source)
你遇到的报错大概率是目标网站的基础反爬机制拦截了你的请求——urllib默认发送的请求里没有携带User-Agent(客户端标识)信息,网站会把它识别成非浏览器的爬虫请求,直接拒绝了访问。
解决方案:给请求添加模拟浏览器的请求头
我们只需要构造一个带浏览器标识的请求头,再发送请求就可以绕过这个拦截了,修改后的代码如下:
import bs4 as bs import urllib.request # 构造请求头,模拟常见的Chrome浏览器(你也可以换成其他浏览器的标识) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'} # 创建带有请求头的Request对象 req = urllib.request.Request('https://pythonprogramming.net/parsememcparseface/', headers=headers) # 发送请求并获取响应内容 source = urllib.request.urlopen(req).read() soup = bs.BeautifulSoup(source, 'lxml') # 用soup的prettify()方法格式化输出HTML,比直接打印原始字节流更易读 print(soup.prettify())
额外小提示:
User-Agent可以在浏览器的开发者工具里找到(按F12,在Network标签里随便找一个请求,查看Request Headers里的User-Agent字段),用真实的浏览器标识成功率更高- 你原来的
print(source)会输出原始的HTML字节流,看起来很乱,用soup.prettify()可以把HTML结构格式化,方便你查看和后续解析
内容的提问来源于stack exchange,提问作者UntouchedDruid4
相关产品推荐
相关产品推荐

