爬虫入门之urllib库详解(二)
爬虫入门之urllib库详解(二)
1 urllib模块
urllib模块是一个运用于URL的包
urllib.request用于访问和读取URLS
urllib.error包括了所有urllib.request导致的异常
urllib.parse用于解析URLS
urllib.robotparser用于解析robots.txt文件(网络蜘蛛)
2 urllib读取网页的三种方式
urlopen直接打开
urlopen返回对象提供的方法
read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作
info(): 返回HTTPMessage对象,表示远程服务器返回的头信息
getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
geturl(): 返回请求的urlurl = "http://www.baidu.com"
response = urllib.request.urlopen(url)
print(response)import urllib.request
response = urllib.request.urlopen('http://python.org/')
html = response.read()
采用User-Agent (用户代理,简称UA)
UA用来包装头部的数据:
-User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
-Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
-Connection:表示连接状态,记录Session的状态header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"}
request = urllib.request.Request(url, headers=header) # 构造一个请求对象发送请求,伪装浏览器访问
response = urllib.request.urlopen(req)
#常用的消息包头
- Accept:text/html,image/* (告诉服务器,浏览器可以接受文本,网页图片)
- Accept-Charaset:ISO-8859-1 [接受字符编码:iso-8859-1]
- Accept-Encoding:gzip,compress [可以接受 gzip,compress压缩后数据]
- Accept-Language:zh-cn [浏览器支持的语言]
- Host:localhost:8080 [浏览器要找的主机]
- Referer:http://localhost:8080/test/abc.html [告诉服务器我来自哪里,常用于防止下载,盗链]
- User-Agent:Mozilla/4.0(Com...) [告诉服务器我的浏览器内核]
- Cookie: [会话]
- Connection:close/Keep-Alive [保持链接,发完数据后,我不关闭链接]
- Date: [浏览器发送数据的请求时间]
定制header信息
在 HTTP Request 中加入特定的 Header,来构造一个完整的HTTP请求消息。
可以通过调用Request.add_header() 添加/修改一个特定的header 也可以通过调用Request.get_header()来查看已有的header。
request.add_header("Connection", "keep-alive") # 一直活着print(request.get_full_url()) # 访问的网页链接
print(request.get_host()) # 服务器域名
print(request.get_method()) # get或post
print(request.get_type()) # http/https/ftpresponse = urllib.request.urlopen(request)
print(response.code) # 状态码200, 404,500
print(response.info) # 网页详细信息data = response.read().decode("gb2312")
print(response.code) # 响应状态码
return data
我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。
3 urllib访问之get与post
1 get方式: 通过将url + ”?” + data 拼接起来赋值给新的url
四步走:
1字典数据编码key=value构建url,headers 2构建请求(url , headers) 3打开请求返回响应 4读取响应
#模拟百度搜索import urllib
from urllib import request
import urllib.parse
def baiduApi(kw):header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}# https://www.baidu.com/s?wd=%E5%8D%83%E9%94%8B # url编码url = 'http://www.baidu.com/s?ie=utf-8&wd='+kw #将信息拼接到url后进行构造req = urllib.request.Request(url, headers=header)response = urllib.request.urlopen(req)print(response.getcode())return response.read().decode('utf-8')if __name__ == '__main__':kw = input('请输入想查找的内容:')#百度搜索会进行url编码 kw = {'kw':kw}wd = urllib.parse.urlencode(kw) #因此将字典形式的kw进行编码 wd=%E5%8D%83%E9%94%8Bresponse = baiduApi(wd)print(response)#模拟智联招聘import urllib
from urllib import request
import urllib.parse
import redef getJobInfo(kw):header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}url = "https://sou.zhaopin.com/jobs/searchresult.ashx?" + kw #get拼接req = urllib.request.Request(url,headers=header)response = urllib.request.urlopen(req) #对象html = response.read().decode('utf-8')jobNumre = '<em>(\d+)</em>' # 匹配岗位数量jobNum = re.findall(jobNumre,html) #找到符合要求的岗位数量列表return jobNum[0]if __name__ == '__main__':jobList = ['java','python','go','php']jobNumDict = {}for job in jobList:kw = {'jl':'杭州','kw':job}kw = urllib.parse.urlencode(kw) #编码例如 jl=%E6%9D%AD%E5%B7%9E&kw=javanumber = getJobInfo(kw)jobNumDict[job] = numberprint(jobNumDict)
2 post方式: 定义字典类型value,保存username和password,通过urlencode对字典编码转二进制返回给data,将数据和url通过Request方法来申请访问
五步走:
1构建headers,url 2字典转二进制data 3构建请求(url , headers,data) 4打开请求返回响应 5读取响应
#抓取网易云热评import urllib.request
import urllib.parse
import jsonheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
}url = "https://music.163.com/weapi/v1/resource/comments/R_SO_4_547976490?csrf_token=" #url请求#form-data数据
data = {
"params": "3u5ErBfSCxBGdgjpJpTQyZVZgmPAv+aisCYZJ9pxk26DoOaS5on9xBjsE65yaS57u9XyxvCJIa78DXJathMsyiClN4LXqhonGNQrAtI2ajxsdW8FosN4kv8psGrRyCBsWrxSJQyfy5pfoeZwxLjB7jHtQkt9hglgZaAfj7ieRWq/XvX3DZtSgLcLrvH/SZOM",
"encSecKey": "872312d7d8b04d2d5dab69d29c9bde5438337f0b3982887e3557468fe7b397de59e85ab349c07f32ef5902c40d57d023a454c3e1ed66205051264a723f20e61105752f16948e0369da48008acfd3617699f36192a75c3b26b0f9450b5663a69a7d003ffc4996e3551b74e22168b0c4edce08f9757dfbd83179148aed2a344826"
}data = urllib.parse.urlencode(data).encode('utf-8') #将data转为二进制 b
req = urllib.request.Request(url,headers=headers,data=data)
response = urllib.request.urlopen(req)
hotComment = json.loads(response.read().decode('utf-8'))
hotCommentList = hotComment['hotComments']for comment in hotCommentList:userId = comment['user']['userId']nickname = comment['user']['nickname']content = comment['content']print((userId,nickname,content))
3 post请求并将数据存入数据库
#抓取阿里巴巴的岗位招聘import urllib
from urllib import request
import json
import urllib.parse
import pymysqlheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
}url = 'https://job.alibaba.com/zhaopin/socialPositionList/doList.json' #url请求获取
for i in range(0,20):data = { #form-data获取的data数据'pageSize': 10,'t': 0.9980968383643134,'pageIndex': i}data = urllib.parse.urlencode(data).encode('utf-8') #url 编码 数据必须转为二进制req = urllib.request.Request(url,headers=headers,data=data) #Request必须接收二进制的dataresponse = urllib.request.urlopen(req)jsonData = json.loads(response.read().decode('utf-8'))jobList = jsonData['returnValue']['datas']for job in jobList:degree = job['degree'] # 学历departmentName = job["departmentName"] # 部门description = job['description'] # 岗位要求firstCategory = job['firstCategory'] # 类型workExperience = job['workExperience'] # 要求with open('ali.txt','a+',encoding='utf-8',errors='ignore') as f: #将数据写入txt文本f.write(str((degree,departmentName,description,firstCategory,workExperience))+'\n')f.flush()
#创建连接
conn = pymysql.connect(host='ip地址', user='root', password="密码",database='spidder', port=3306,charset='utf8')
#创建游标
cursor = conn.cursor()
with open('ali.txt','r',encoding='utf-8',errors='ignore') as f:while True:jobTextInfo = f.readline()if not jobTextInfo:breakjobTextInfo = eval(jobTextInfo)#插入sql语句sql = 'insert into ali(degree,departmentName,description,firstCategory,workExperience) VALUES (%r,%r,%r,%r,%r)' %(jobTextInfo[0], jobTextInfo[1], jobTextInfo[2], jobTextInfo[3], jobTextInfo[4])cursor.execute(sql) #执行sql语句conn.commit() #提交
#关闭连接
cursor.close()
conn.close()
4 json编码解析
当请求响应结果为json数据时,出现了二进制编码转不了情况,可以设置为非ascii编码
import urllib.request
import urllib.parse
import jsonheaders = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}post_url = "http://fanyi.baidu.com/sug"data = {"kw":"baby"
}
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url=post_url,headers=headers,data=data)
response = urllib.request.urlopen(req)
content = response.read().decode('utf-8') #str字符串,但是嵌套的数据没解析为中文#将字符串转json对象
obj = json.loads(content)
#将json对象转换成非ascii编码对象
string = json.dumps(obj,ensure_ascii=False)
print(string)#输出
{"errno": 0, "data": [{"k": "baby", "v": "n. 婴儿; 婴孩; 幼崽; 宝贝儿; vt. 把…当作婴孩看待,娇养; 纵容; adj. 孩子的;"}, {"k": "babysitter", "v": "n. 临时照顾幼儿者;"}, {"k": "babysit", "v": "vi. 临时受雇代外出的父母照料小孩;"}, {"k": "babysitting", "v": "n. 托婴服务; v. 临时受雇代外出的父母照料小孩( babysit的现在分词 );"}, {"k": "baby sitter", "v": "n. <美>代人临时照顾婴孩者;"}]}
4 处理HTTPS请求 SSL证书验证
现在随处可见 https 开头的网站,urllib2可以为 HTTPS 请求验证SSL证书,就像web浏览器一样,如果网站的SSL证书是经过CA认证的,则能够正常访问,如:https://www.baidu.com/等...
如果SSL证书验证不通过,或者操作系统不信任服务器的安全证书,比如浏览器在访问12306网站如:https://www.12306.cn/mormhweb/的时候,会警告用户证书不受信任。(据说 12306 网站证书是自己做的,没有通过CA认证)
import urllib
from urllib import request
# 1. 导入Python SSL处理模块
import ssl# 2. 表示忽略未经核实的SSL证书认证
context = ssl._create_unverified_context()url = "https://www.12306.cn/mormhweb/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
request = urllib.request.Request(url, headers = headers)# 3. 在urlopen()方法里 指明添加 context 参数
response = urllib.request.urlopen(request, context = context)
print(response.read().decode())
5 封装
常见功能可以进行简单的封装
import urllib.request
import urllib.parsedef create_request(category,page):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}base_url = "http://tieba.baidu.com/f?ie=utf-8&"data = {'kw':category,'pn':(page-1)*50}data = urllib.parse.urlencode(data)url = base_url + datareq = urllib.request.Request(url,headers=headers)return reqdef get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return contentdef save_path(content,path,page):filename = path + 'tieba' + str(page) + '.html'with open(filename,'w',encoding='utf-8') as fp:fp.write(content)def main():category = input('请输入查询类型:')start_page = int(input('请输入起始页码:'))end_page = int(input('请输入终止页码:'))print('数据下载中..')for page in range(start_page,end_page+1):request = create_request(category,page)content = get_content(request)save_path(content,'./tieba',page)print('下载成功')if __name__ == '__main__':main()
转载于:https://www.cnblogs.com/why957/p/9213246.html
爬虫入门之urllib库详解(二)相关推荐
- 爬虫笔记:Urllib库详解
如果不懂爬虫,请看链接 爬虫第一课:爬虫的基本原理 什么是Urllib Urllib是python 内置的http的请求库.包含四个模块 urllib.request 请求模块 urllib.erro ...
- 爬虫笔记:Requests库详解
什么是Requests 之前讲解了爬虫笔记:Urllib库详解发现确实有不方便的地方,比如加一个代理,cookie,发送post请求比较繁琐. Request库能用几句话实现这些. Requests ...
- python爬虫之urllib库详解
python爬虫之urllib库详解 前言 一.urllib库是什么? 二.urllib库的使用 urllib.request模块 urllib.parse模块 利用try-except,进行超时处理 ...
- Python Urllib库详解
Urllib库详解 什么是Urllib? Python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常处理模块 urllib.parse url解析模块 u ...
- Python爬虫入门之Urllib库的基本使用
那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解 ...
- Python3爬虫入门之Urllib库的用法
urllib库的用法 urlopen urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,cont ...
- Python爬虫入门三urllib库基本使用
urllib是一个收集了多个涉及了URL的模块的包: URL获取网页 urllibtest.pyimport urllib2 response = urllib2.urlopen('http://ww ...
- python爬虫知识点总结(三)urllib库详解
一.什么是Urllib? 官方学习文档:https://docs.python.org/3/library/urllib.html 廖雪峰的网站:https://www.liaoxuefeng.com ...
- python beautifulsoup库_Python爬虫系列:BeautifulSoup库详解
点击上方蓝字关注"程序员Bob"呀~ 每个人的生命都是通向自我的征途,是对一条道路的尝试,是一条小径的悄然召唤.人们从来都无法以绝对的自我之相存在,每一个人都在努力变成绝对自我,有 ...
最新文章
- CS131专题-4:拟合(最小二乘、RANSAC、霍夫变换)
- [个人博客作业Week7]软件工程团队项目感想与反思
- linux下大于2TB硬盘格式化及挂载,linux下大于2T的分区方法
- qq分享提示设备未授权_QQ帐号已经可以注销了,过去几天,第一批尝试的人已经放弃了!...
- 前端数据的加密和解密--对象解密的坑
- (5) DSP28335--SCI
- CodeForces - 1514D Cut and Stick(线段树/随机数)
- background意识(两)
- 剑指offer之分行从上到下打印二叉树
- Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的
- linux软件安装方法
- afnetworking 和 asihttprequest 强制修改http连接的host地址
- HeadFirstJava——十大遗珠之憾
- java斐波那契数列_斐波那契数列(Java)
- wps教育版支持latex公式啦
- matlab画彩色光栅,通过四种方法,在MATLAB中画一维光栅
- C专家编程 第9章 再论数组 9.6 C语言的多维数组
- 串口硬盘与并口硬盘详解:IDE SATA SCSI 接口详解
- HTML前端静态网页制作
- 8个Python工具,用来做应用程序开发真的很好用
热门文章
- 很想去摆地摊,可是不知道怎么开始,前期需要做什么准备工作吗?
- 每天快走一小时,身体会有什么变化?
- 属马的人性格有什么缺点和优点?
- 好时光·宝髻偏宜宫样 [唐] 李隆基
- 今天有个销售员在问我:“自己每天都有在学习,但是为什么感觉没什么用,进步不大。”
- 近些年CPU的性能是不是快到天花板了?
- 男朋友花3000元买一块电脑显卡,他是怎么想的?
- 在5G时代,微信还能活多久?
- Qt——P11 自定义的信号和槽发生重载的解决
- aws rds监控慢sql_使用AWS Backup备份AWS RDS SQL Server数据库