问题:有时我们无法爬取一些网页,会出现403错误,因为这些网页做了反爬虫设置
解决办法:模拟成浏览器访问,爬取所需要的信息

一、获取获取User-Agent信息

 

所获得的信息为:”User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36”。这个信息只需要获取一次,以后爬取其它网站都可以用。

python模拟浏览器爬虫 python 模拟浏览器操作_Chrome

二、将爬虫模拟成浏览器访问

方法一:使用build_opener()修改报头

由于urlopen()不支持一些HTTP的高级功能,我们可以采用urllib.request.build_opener()进行修改报头

#使用urllib.request.build_opener()修改报头,模拟成浏览器并爬取文章《01精通Python网络爬虫——快速使用Urllib爬取网页》
import urllib.request #导入模块
url = "" #将要爬取的网址赋值给变量url
headers = ("User-Agent","Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36")#定义一个变量headers存储对应的User-Agent信息,格式为:("User-Agent",具体信息)
opener = urllib.request.build_opener()#创建自定的opener对象并赋值给变量opener
opener.addheaders = [headers]#设置对应的头信息,格式:"opener对象名.addheaders = [头信息],之后就可以通过opener对象的open()方法打开网址
data = opener.open(url).read()#模仿为浏览器去打开、爬取网址并读取赋值给变量data.此时是具有头信息的打开操作
fhandle = open("D:/Python35/myweb/part4/3.html","wb") #用 "wb"二进制的方式用open()函数打开该文件,并赋值给fhandle变量
fhandle.write(data) #用write()函数将data的数据写入变量fhandle
fhandle.close() #用close()函数关闭该文件

方法二:使用add_header()修改报头

除了方法一,我们还可以使用urllib.request.Request()下的add_header()实现浏览器的模拟

#使用urllib.request.Request()下的add_header()修改报头,模拟成浏览器并爬取文章《01精通Python网络爬虫——快速使用Urllib爬取网页》
import urllib.request#导入模块
url = "" #将要爬取的网址赋值给变量url
req = urllib.request.Request(url)#创建一个Request对象并赋值给req变量,格式为:urllib.request.Request(url地址)
req.add_header("User-Agent","Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36")#使用add_header()函数添加对应的User-Agent信息,格式为:Request对象名.add_header(字段名,字段值)
data = urllib.request.urlopen(req).read()#模仿为浏览器去打开、爬取网址并读取赋值给变量data.此时是具有头信息的打开操作
fhandle = open("D:/Python35/myweb/part4/4.html","wb") #用 "wb"二进制的方式用open()函数打开该文件,并赋值给fhandle变量
fhandle.write(data) #用write()函数将data的数据写入变量fhandle
fhandle.close() #用close()函数关闭该文件

说明:爬取“”不用模拟成浏览器也可以达到目的。
注意:方法一中使用的是addheaders()方法,方法2中使用的是add_header()方法,注意末尾有无s以及有无下划线的区别

三、超时异常设置

我们访问一个网页,如果长时间未响应,那么系统就会判断该网页超时,即无法打开该网页,格式为:urllib.request.urlopen(要打开的网址,timeout = 时间值)

#超时设置
import urllib.request#导入模块
for i in range(1,10):
    try:
        data = urllib.request.urlopen("",timeout = 10).read()#超时设置为10s
        fhandle = open("D:/Python35/myweb/part4/5.html","wb") #用 "wb"二进制的方式用open()函数打开该文件,并赋值给fhandle变量
        fhandle.write(data) #用write()函数将data的数据写入变量fhandle
        fhandle.close() #用close()函数关闭该文件
    except Exception as e:
        print("打印异常-->"+str(e))