urllib简介
urllib库是一个比较简单是爬虫库,有了它,我们只需要关心请求的链接是什么,需要传的参数是什么,以及如何设置可选的请求头就好了,不用深入到底层去理解它到底是怎样传输和通信的。有了它,两行代码就可以完成一个请求和响应的处理过程,得到网页内容。
使用urllib
request 它是最基本的 HTTP 请求模块,可以用来模拟发送请求,就像在浏览器里输入网址然后回车一样,只需要给库方法传入URL 及额外的参数,就可以模拟实现这个过程了。
error 异常处理模块,如果出现请求错误,我们可以捕捉这些异常,然后进行重试或者其他操作以保证程序不会意外终止。
parse 一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等。
robotparse 主要是用来识别网址的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,它其实用得比较少。
一、发起请求
1、使用urlopen()
urllib request 模块提供了最基本的构造 HTTP请求的方法, 利用它可以 拟浏览器的一个请求发起过程, 同时它还带有处理授权验证( authenticaton )、重定向( redirection 、浏览器 Cookies 及其他内容。
get请求
#使用urllib做简单的爬虫
##1.导入请求的模块
from urllib import request
#2.发起请求:
request = request.urlopen('http://www.jd.com')
#3.读取相应内容:
content = request.read()
#4.转码:
html = content.decode('utf-8')
print(html)
with open('jd.html','w',encoding='utf-8')as fp:
fp.write(html)
如果我们在浏览器上打开百度主页,右键选择“查看源代码”,你会发现,跟我们刚才打印出来的是一模一样。也就是说,上面的 4 行代码就已经帮我们把百度的首页的全部代码爬了下来。
二、User-Age使用
但是这样直接用 urllib 给一个网站发送请求的话,确实略有些唐突了,就好比,人家每家都有门,你以一个路人的身份直接闯进去显然不是很礼貌。而且有一些站点不喜欢被程序(非人为访问)访问,有可能会拒绝你的访问请求。
但是如果我们用一个合法的身份去请求别人网站,显然人家就是欢迎的,所以我们就应
该给我们的这个代码加上一个身份,就是所谓的 User-Agent 头。
url= 'https://www.baidu.com/'
headers = {
'User-Agent':' Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'
}
##1.封装请求头:
req = request.Request(url=url,headers=headers)
##2.发起请求
html = request.urlopen(req).read().decode('utf-8')
##3.保存
with open('baidu.html','w',encoding='utf-8')as f:
f.write(html)
在 HTTP Request 中加入特定的 Header,来构造一个完整的 HTTP 请求消息。
可以通过调用 Request.add_header() 添加/修改一个特定的 header 也可以通过调用
Request.get_header()来查看已有的 header。
以上是get请求的方法,接下来看看post请求。
post请求
我们需要找到传递的参数,比如百豆瓣电影,需要传递‘type、inteval_id、start、limit’,对参数进行解析再使用请求。
多打开几个网址,分析哪些是变量,根据变量得不同,获取信息,再拼接url。
from urllib import request,parse
import json
base_url = 'https://movie.douban.com/j/chart/top_list?&action=&'
data = {
'type':11,
'interval_id':'100:90',
'start':0,
'limit':100
}
data_str = parse.urlencode(data)
url = base_url+data_str
content = request.urlopen(url=url).read().decode('utf-8')
content = json.loads(content)
with open('douban.json','w',encoding='utf-8')as f:
for item in content:
f.write(json.dumps(item,ensure_ascii=False)+'\n')
了解了请求方式,就能根据获取的网址进行请求得到自己想得到的数据,网址通过解析拼接得到。
进阶COOKIE的使用
当用户通过浏览器首次访问一个域名时,访问的 web 服务器会给客户端发送数据,以保持 web 服务器与客户端之间的状态保持,这些数据就是 cookie,它是 Internet 站点创建的,为了辨别用户身份而储存在用户本地终端上的数据,cookie 大部分都是加密的,cookie 存在与缓存中或者硬盘中,在硬盘中的是一些文本文件,当你访问该网站时,就会读取对应的网站的 cookie 信息,cookie 有效地提升了用户体验,一般来说,一旦将 cookie 保存在计算机上,则只有创建该 cookie 的网站才能读取它。
四行代码实现自动生成cookie
from urllib import request,parse
from http import cookiejar
#生成步骤
cookie = cookiejar.CookieJar()
#cookie管理器
processor = request.HTTPCookieProcessor()
#http/https请求管理器
http_handler = request.HTTPHandler()
https_handler = request.HTTPSHandler()
##创建一个人浏览器对象
opener = request.build_opener(http_handler,https_handler,processor)
模拟登陆
#登录
def login():
url = 'http://www.renren.com/PLogin.do'
data = {
'email':'###',#自己的账号
'password':'##3'#自己的登录密码
}
data_str = parse.urlencode(data)
headers = {
'User-Agent':' Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'
}
req = request.Request(url=url,headers=headers,data=bytes(data_str,encoding='utf-8'))
#发起请求
response = opener.open(req)
getHome()
#获取首页:
def getHome():
url = 'http://www.renren.com/969835305/profile'
content = opener.open(url).read().decode('utf-8')
#保存
with open('renrenlogin.html','w',encoding='utf-8')as f :
f.write(content)
if __name__ == '__main__':
login()
urllib这个库的使用还是比较简单的,对于刚接触爬虫的小伙伴来说容易理解,网上还有很多教程,可以模仿着学习,练习一下,如果有什么不清楚的地方,可以留言告诉我,我很乐意帮您解答。
以上,加油吧!