一、requests库
Urllib库是Python的标准库,提供urllib.request、urllib.response、urllib.parse、urllib.error四个模块。
官方文档:https://docs.python.org/zh-cn/3.7/library/urllib.html
requests库是优秀的处理HTTP请求的第三方库,基于urllib库,但比urllib功能更强大。
官方文档:https://requests.readthedocs.io/zh_CN/latest/
1.1 安装
1.2 捕获网页
1.2.1 get() 方法
#利用requests读取并显示网页的内容import requestsresponse = requests.get('http://www.baidu.com')print (type(response))print (response)<class 'requests.models.Response'><Response [200]>
最基本的请求可以直接使用get() 方法,如果需要参数,可以利用params。
如果向服务器发起get请求的时候,问号(?) 后面的字符串会被解析为查询字符串,格式一般为:
?key1=value1&?key2=value2
如果手工构建URL,那么数据会以键/值对的形式置于URL中,连接在一个问号的后面。
eg:http://baidu.com/get?key1=value1&?key2=value2
Requests允许使用params关键字参数,以一个字典提供这些参数。
import requestsplaydown = {'key1': 'value1', 'key2': 'value2'}r = requests.get('http://baidu.com',params=playdown)print(r.ttp://baidu.com/?key1=value1&key2=value2url)##结果http://baidu.com/?key1=value1&key2=value2
get() 方法的返回值会保存为一个Response对象,Response作为服务器对get() 响应的结果,网络爬虫的后续操作主要是通过调用Response对象的属性和方法实现相关的功能
1.2.2 其他方法
import requestsresponse1 = requests.get('http://www.baidu.com')print (type(response1))print ("get:",response1)response12= requests.post('http://www.baidu.com')print (type(response12))print ("post:",response12)response3= requests.put('http://www.baidu.com')print (type(response3))print ("put:",response3)response4= requests.delete('http://www.baidu.com')print (type(response4))print ("delete:",response4)response5= requests.head('http://www.baidu.com')print (type(response5))print ("head:",response5)response6= requests.options('http://www.baidu.com')print (type(response6))print ("options:",response6)##结果<class 'requests.models.Response'>get: <Response [200]><class 'requests.models.Response'>post: <Response [302]><class 'requests.models.Response'>put: <Response [302]><class 'requests.models.Response'>delete: <Response [302]><class 'requests.models.Response'>head: <Response [200]><class 'requests.models.Response'>options: <Response [302]>
1.3 Response对象的主要属性
| 属性 | 说明 |
|---|---|
| status_code属性 | HTTP请求的返回状态 200表示成功 404表示连接失败 |
| text属性 | HTTP响应的字符串内容,会自动根据响应头部的编码进行解码 |
| encoding属性 | HTTP响应的编码方式 |
| content属性 | HTTP响应的字节方式 |
| headers属性 | 以字典对象存储服务器响应头,字典键不区分大小写,如果键不存在,就返回None |
| URL属性 | URL |
import requestsresponse = requests.get('http://www.baidu.com')print ("状态码:",response.status_code)print ("字符串内容: ",response.text)print ("编码方式:",response.encoding)print ("字节方式:",response.content)print ("服务器响应头",response.headers)##结果状态码: 200字符串内容: <!DOCTYPE html><!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>ç¾åº¦ä¸ä¸ï¼ä½ å°±çé</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=ç¾åº¦ä¸ä¸ class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ°é»</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>å°å</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§é¢</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>ç»å½</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">ç»å½</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æå¤äº§å</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å³äºç¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使ç¨ç¾åº¦åå¿è¯»</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>æè§åé¦</a> 京ICPè¯030173å· <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>编码方式: ISO-8859-1字节方式: b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\x81\x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b class="bgs_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>\xe6\x96\xb0\xe9\x97\xbb</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>\xe5\x9c\xb0\xe5\x9b\xbe</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>\xe8\xa7\x86\xe9\xa2\x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>\xe8\xb4\xb4\xe5\x90\xa7</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>\xe7\x99\xbb\xe5\xbd\x95</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">\xe7\x99\xbb\xe5\xbd\x95</a>\');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">\xe6\x9b\xb4\xe5\xa4\x9a\xe4\xba\xa7\xe5\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>\xe5\x85\xb3\xe4\xba\x8e\xe7\x99\xbe\xe5\xba\xa6</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>\xe4\xbd\xbf\xe7\x94\xa8\xe7\x99\xbe\xe5\xba\xa6\xe5\x89\x8d\xe5\xbf\x85\xe8\xaf\xbb</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>\xe6\x84\x8f\xe8\xa7\x81\xe5\x8f\x8d\xe9\xa6\x88</a> \xe4\xba\xacICP\xe8\xaf\x81030173\xe5\x8f\xb7 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'服务器响应头 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Tue, 22 Dec 2020 08:34:41 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:28:24 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
1.4 Response的方法
| 方法 | 说明 |
|---|---|
| json() | 内置的JSON解码器,解析JSON数据 |
| raise_for_status() | 如果get请求失败(非200响应),则抛出异常 |
import requestsURL ='http://ip.taobao.com/service/getIpinfo.php'try:r = requests.get(URL,params={'ip':'8.8.8.8'},timeout=1)r.raise_for_status() ##状态码如果不是200,则抛出异常except requests.RequestException as e:print (e)else:result = r.json()print(type(result),result,sep='\n')##结果404 Client Error: Not Found for url: http://ip.taobao.com/service/getIpinfo.php?ip=8.8.8.8
二、beautifulsoup4库
2.1 安装
官网: https://pypi.org/project/beautifulsoup4/4.3.2/
官方文档:https://beautiful-soup-4.readthedocs.io/en/latest/
pip install beautifulsoup4
2.2 介绍
beautifulsoup4库不仅可以解析HTML页面内容,还可以读取XML文件内容。
beautifulsoup4库提供一些直接处理HTML页面的函数(方法),可以方便快捷地解析页面元素。
beautifulsoup4库将解析的每一个HTML页面当作一个对象,通过调用页面对象的属性和方法实现对页面的解析。
HTML页面中的每一个标签Tag 都是beautifulsoup4创建的页面对象的一个属性。
import requestsfrom bs4 import BeautifulSoup ##导入bs4库中的Beautifulsoup类r = requests.get('http://www.baidu.com')r.encoding = 'utf-8'soup = BeautifulSoup(r.text) ##soup是BeautifulSoup类的实例化print(soup)print(type(soup))print(soup.p)print(soup.a)print(soup.title)##结果lly isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.The code that caused this warning is on line 56 of the file e:/pythonstduy/pachuo.py. To get rid of this warning, pass the additional argument 'features="lxml"' to theBeautifulSoup constructor.soup = BeautifulSoup(r.text)<!DOCTYPE html><!--STATUS OK--><html> <head><meta content="text/html;charset=utf-8" http-equiv="content-type"/><meta content="IE=Edge" http-equiv="X-UA-Compatible"/><meta content="always" name="referrer"/><link href="http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/><title>百度一下,你就知道</title></head> <body link="#0000cc"> <div id="wrapper"> <div id="head"> <div class="head_wrapper"> <div class="s_form"> <div class="s_form_wrapper"> <div id="lg"> <img height="129" hidefocus="true" src="//www.baidu.com/img/bd_logo1.png" width="270"/> </div> <form action="//www.baidu.com/s" class="fm" id="form" name="f"> <input name="bdorz_come" type="hidden" value="1"/> <input name="ie" type="hidden" value="utf-8"/> <input name="f" type="hidden" value="8"/> <input name="rsv_bp" type="hidden" value="1"/> <input name="rsv_idx" type="hidden" value="1"/> <input name="tn" type="hidden" value="baidu"/><span class="bg s_ipt_wr"><input autocomplete="off" autofocus="" class="s_ipt" id="kw"maxlength="255" name="wd" value=""/></span><span class="bg s_btn_wr"><input class="bg s_btn" id="su" type="submit" value="百度一下"/></span> </form> </div> </div> <divid="u1"> <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a> <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a> <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a> <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a> <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a> <noscript> <a class="lb" href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" name="tj_login">登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品</a> </div> </div> </div> <div id="ftCon"> <div id="ftConw"> <p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p> <p id="cp">©2017 Baidu <a href="http://www.baidu.com/duty/">使用百度前必读</a> <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a> 京ICP证030173号 <img src="//www.baidu.com/img/gs.gif"/> </p> </div> </div> </div> </body> </html><class 'bs4.BeautifulSoup'><p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p><a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a><title>百度一下,你就知道</title>
soup对象的每一个标签也是一个对象,称为Tag对象
Tag对象的属性:
name:标签的名字
attrs:以字典的形式返回原页面所有标签的所有属性
contents:以列表形式返回该标签下所有标签的内容
string:以字符串形式返回标签包含的文本内容,如果标签内嵌套一层标签,则返回最内层标签的内容;如果标签内嵌套多层标签,则返回None
import requestsfrom bs4 import BeautifulSoupr = requests.get('http://www.baidu.com')r.encoding = 'utf-8'soup = BeautifulSoup(r.text)print('title的名字',soup.title.name) ##输出title的名字print('title包含的文本内容',soup.title.string) ##输出title包含的文本内容print('soup.title.parent.name:',soup.title.parent.name)print('soup.p:',soup.p)print('第一个超链接:',soup.a) ##返回第一个超链接print('超链接的所有属性: ',soup.a.attrs) ##返回超链接的所有属性print('返回最内层标签的内容:',soup.a.string) ##多次嵌套,返回最内层标签的内容print('该标签下所有标签的内容:',soup.p.contents) ##返回该标签下所有标签的内容print("所有的超链接:",soup.find_all('a'))##结果title的名字 titletitle包含的文本内容 百度一下,你就知道soup.title.parent.name: headsoup.p: <p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p>第一个超链接: <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>超链接的所有属性: {'href': 'http://news.baidu.com', 'name': 'tj_trnews', 'class': ['mnav']}返回最内层标签的内容: 新闻该标签下所有标签的内容: [' ', <a href="http://home.baidu.com">关于百度</a>, ' ', <a href="http://ir.baidu.com">About Baidu</a>, ' ']所有的超链接: [<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>, <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>, <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a>, <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a>, <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>, <a class="lb" href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" name="tj_login">登录</a>, <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品</a>, <a href="http://home.baidu.com">关于百度</a>, <a href="http://ir.baidu.com">About Baidu</a>, <a href="http://www.baidu.com/duty/">使用百度前必读</a>, <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a>]
2.3 实例
##爬取淘宝网首页的中文产品类别import requestsfrom bs4 import BeautifulSoupr = requests.get('http://taobao.com')r.encoding='utf-8'soup = BeautifulSoup(r.text,"html.parser")for list in soup.find_all('a'): ##匹配被封装在<a></a>之间的结构,如果不为空,就输出if not list.string == None:print(list.string)##结果已买到的宝贝我的足迹收藏的宝贝收藏的店铺免费开店已卖出的宝贝出售中的宝贝卖家服务市场卖家培训中心体检中心问商友消费者客服卖家客服淘宝网淘宝网新款连衣裙四件套潮流T恤时尚女鞋短裤半身裙男士外套墙纸行车记录仪新款男鞋耳机时尚女包沙发天猫聚划算天猫超市司法拍卖淘宝心选飞猪旅行智能生活苏宁易购女装内衣家居女鞋男鞋箱包母婴童装玩具男装运动户外美妆彩妆个护手机数码企业大家电生活电器零食生鲜茶酒厨具收纳清洁家纺家饰鲜花图书音像文具医药保健进口汽车二手车用品房产装修家具建材手表眼镜珠宝饰品登录注册开店公告规则论坛安全公益关于开展打击网络“有偿删帖”和“软色情”专项的公告淘宝造物节之城市秘密聚划算88红包省钱卡95公益周阿里、腾讯等六家公司同台联合做公益
抓取糗事百科的热门段子import requestsfrom bs4 import BeautifulSoupresponse = requests.get('http://www.qiushibaike.com')content = response.contentsoup = BeautifulSoup(content, "html.parser")print(response.status_code)for div in soup.find_all('div'): ##匹配被封装在<div></div>之间的文本内容,如果不为空,就输出print(div.text.strip()) #string.strip([chars]) 方法删除字符串开头和结尾指定的字符或字符序列 (即不能删中间字符)。##结果QQ空间手机扫描二维码关注互联网ICP备案:京ICP备14028348号-1广播电视节目制作经营许可证:(京)字第08319号网络文化经营许可证:京网文[2020]0625-100号增值电信业务经营许可证:京ICP证140448号计算机信息网络国际联网单位备案:京公网安备11010502031601号网上有害信息举报专区违法和不良信息举报电话:18126520579邮箱:kefu@qiushibaike.com友际无限(北京)科技有限公司© Qiushibaike.com 糗事百科版权所有

