urlretrieve()函数:下载网页到本地
urllib.request.urlretrieve('网址','下载到本地的位置')
info()函数:获取页面信息
getcode():获取当前页面状态信息
geturl():获取当前访问的网页的url
以上三个函数的使用格式:
f=urllib.request.urlopen('http://www.baidu.com')
print(f.info())#获取页面信息
print(f.getcode())#获取当前页面的状态码
print(f.geturl)#获取当前访问页面的url
urlcaeanup()函数:清除爬虫爬取过程中产生的缓存,提升处理速度。
urllib.request.urlcleanup()
作用:超时设置是为了受解决网络或者服务器的影响,网页无法访问的问题。使用timeout设置响应时间,单位为秒。
import urllib.request
f=urllib.request.urlopen('http://www.baidu.com',timeout=1)
超时设置可以和异常处理结合,实现具体问题的处理:
import urllib.request
try:
f=urllib.request.urlopen('http://www.baidu.com',timeout=1)
except Exception as err:
print('出现错误')
http请求是客户端在于服务器进行通信时的必要手段。http请求分为很多种:
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
GET的形式:.html?字段=值&字段=值····
代码演示:
import urllib.request
import re
keyword='Python'#keword=urllib.request.quote(keword)中文需要转码
url='https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd='+keyword
info=urllib.request.urlopen(url).read().decode('utf-8')
print(info)
pat="title:'(.*?)',"
rst=re.compile(pat).findall(info)
print(rst)
POST请求:
import urllib.parse
posturl="网站/mypost/"
postdata=urllib.parse.urlencode({
"name":"用户名",
"pass":"密码",
}).encode("utf-8")
#进行post,就需要使用urllib.request下面的Request(真实post地址,post数据)
req=urllib.request.Request(posturl,postdata)
rst=urllib.request.urlopen(req).read().decode("utf-8")
爬虫异常处理:
URLError与HTTOError
URLError出现的原因:
1 连不上服务器
2 远程url不存在
3 无网络
4 触发HTTPError
使用urllib.error模块
代码演示:
try:
urllib.request.urlopen('网址')
except urllib.error.URLError as e:
if hasattr(e,'code'):
print(e.code)
if hasattr(e,'reason'):
print(e.reason)
打开任意浏览器,按F12,找到网络,点all,当刷新页面或者点击新的链接时候会出现一部分URL,点击任意的URL,找到消息头里面的请求头里面的User-Agent,这就是在访问网址时候,服务器识别你是个浏览器还是个爬虫的依据。所以,在爬虫爬取时候,我们可以改爬虫的报头去实现爬取。
代码演示:
import urllib.request
import re
url='https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=monline_3_dg&wd=Python'
#伪装头文件,使用元组的方式
headers=('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0')
opener=urllib.request.build_opener()
opener.addheaders=[headers]
info=opener.open(url).read().decode('utf-8')
print(info)
pat="title:'(.*?)',"
rst=re.compile(pat).findall(info)
print(rst)
个人总结:
通过以上方法伪装浏览器实现对页面的访问,可以有效地防止反爬虫机制,实现对数据的爬取。首先将要伪装的浏览器的User-Agent信息以元组的方式保存,接着利用urllib.request里的urllib.request.build_opener()对http进行高级处理,利用addheaders()实现浏览器的模拟,当然也可以使用add_header('User-Agent'(字段名),字段值)。