一、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 安装

pip install requests
image.png

1.2 捕获网页

1.2.1 get() 方法

  1. #利用requests读取并显示网页的内容
  2. import requests
  3. response = requests.get('http://www.baidu.com')
  4. print (type(response))
  5. print (response)
  6. <class 'requests.models.Response'>
  7. <Response [200]>

最基本的请求可以直接使用get() 方法,如果需要参数,可以利用params。
如果向服务器发起get请求的时候,问号(?) 后面的字符串会被解析为查询字符串,格式一般为:
?key1=value1&?key2=value2
如果手工构建URL,那么数据会以键/值对的形式置于URL中,连接在一个问号的后面。
eg:http://baidu.com/get?key1=value1&?key2=value2

Requests允许使用params关键字参数,以一个字典提供这些参数。

  1. import requests
  2. playdown = {'key1': 'value1', 'key2': 'value2'}
  3. r = requests.get('http://baidu.com',params=playdown)
  4. print(r.ttp://baidu.com/?key1=value1&key2=value2url)
  5. ##结果
  6. http://baidu.com/?key1=value1&key2=value2

get() 方法的返回值会保存为一个Response对象,Response作为服务器对get() 响应的结果,网络爬虫的后续操作主要是通过调用Response对象的属性和方法实现相关的功能

1.2.2 其他方法

  1. import requests
  2. response1 = requests.get('http://www.baidu.com')
  3. print (type(response1))
  4. print ("get:",response1)
  5. response12= requests.post('http://www.baidu.com')
  6. print (type(response12))
  7. print ("post:",response12)
  8. response3= requests.put('http://www.baidu.com')
  9. print (type(response3))
  10. print ("put:",response3)
  11. response4= requests.delete('http://www.baidu.com')
  12. print (type(response4))
  13. print ("delete:",response4)
  14. response5= requests.head('http://www.baidu.com')
  15. print (type(response5))
  16. print ("head:",response5)
  17. response6= requests.options('http://www.baidu.com')
  18. print (type(response6))
  19. print ("options:",response6)
  20. ##结果
  21. <class 'requests.models.Response'>
  22. get <Response [200]>
  23. <class 'requests.models.Response'>
  24. post <Response [302]>
  25. <class 'requests.models.Response'>
  26. put <Response [302]>
  27. <class 'requests.models.Response'>
  28. delete <Response [302]>
  29. <class 'requests.models.Response'>
  30. head <Response [200]>
  31. <class 'requests.models.Response'>
  32. options <Response [302]>

1.3 Response对象的主要属性

属性 说明
status_code属性 HTTP请求的返回状态
200表示成功
404表示连接失败
text属性 HTTP响应的字符串内容,会自动根据响应头部的编码进行解码
encoding属性 HTTP响应的编码方式
content属性 HTTP响应的字节方式
headers属性 以字典对象存储服务器响应头,字典键不区分大小写,如果键不存在,就返回None
URL属性 URL
  1. import requests
  2. response = requests.get('http://www.baidu.com')
  3. print ("状态码:",response.status_code)
  4. print ("字符串内容: ",response.text)
  5. print ("编码方式:",response.encoding)
  6. print ("字节方式:",response.content)
  7. print ("服务器响应头",response.headers)
  8. ##结果
  9. 状态码: 200
  10. 字符串内容: <!DOCTYPE html>
  11. <!--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=#0000
  12. cc> <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=ç¾
  13. 度ä¸ä¸ 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 na
  14. me=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> <
  15. a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baid
  16. u.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='+ encodeUR
  17. IComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">ç»å½</a>');</script> <a href=//www.baidu.
  18. 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
  19. ³äºç¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使ç¨ç¾åº¦åå¿
  20. 读</a>&nbsp
  21. ; <a href=http://jianyi.baidu.com/ class=cp-feedback
  22. è§åé¦</a>&nbsp;京ICPè¯030173å·&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </bod
  23. y> </html>
  24. 编码方式: ISO-8859-1
  25. 字节方式: 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="bg
  26. s_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&amp;tpl=mn&amp;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>&copy;2017&nbsp;Baidu&nbsp;<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>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>\xe6\x84\x8f\xe8\xa7\x81\xe5\x8f\x8d\xe9\xa6\x88</a>&nbsp;\xe4\xba\xacICP\xe8\xaf\x81030173\xe5\x8f\xb7&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
  27. 服务器响应头 {'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响应),则抛出异常
  1. import requests
  2. URL ='http://ip.taobao.com/service/getIpinfo.php'
  3. try:
  4. r = requests.get(URL,params={'ip':'8.8.8.8'},timeout=1)
  5. r.raise_for_status() ##状态码如果不是200,则抛出异常
  6. except requests.RequestException as e:
  7. print (e)
  8. else:
  9. result = r.json()
  10. print(type(result),result,sep='\n')
  11. ##结果
  12. 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

image.png

2.2 介绍

beautifulsoup4库不仅可以解析HTML页面内容,还可以读取XML文件内容。
beautifulsoup4库提供一些直接处理HTML页面的函数(方法),可以方便快捷地解析页面元素。
beautifulsoup4库将解析的每一个HTML页面当作一个对象,通过调用页面对象的属性和方法实现对页面的解析。
HTML页面中的每一个标签Tag 都是beautifulsoup4创建的页面对象的一个属性。

  1. import requests
  2. from bs4 import BeautifulSoup ##导入bs4库中的Beautifulsoup类
  3. r = requests.get('http://www.baidu.com')
  4. r.encoding = 'utf-8'
  5. soup = BeautifulSoup(r.text) ##soup是BeautifulSoup类的实例化
  6. print(soup)
  7. print(type(soup))
  8. print(soup.p)
  9. print(soup.a)
  10. print(soup.title)
  11. ##结果
  12. 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.
  13. 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 the
  14. BeautifulSoup constructor.
  15. soup = BeautifulSoup(r.text)
  16. <!DOCTYPE html>
  17. <!--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"
  18. 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> <div
  19. id="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&amp;tpl=mn&amp;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>
  20. <class 'bs4.BeautifulSoup'>
  21. <p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p>
  22. <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
  23. <title>百度一下,你就知道</title>

soup对象的每一个标签也是一个对象,称为Tag对象
Tag对象的属性:
name:标签的名字
attrs:以字典的形式返回原页面所有标签的所有属性
contents:以列表形式返回该标签下所有标签的内容
string:以字符串形式返回标签包含的文本内容,如果标签内嵌套一层标签,则返回最内层标签的内容;如果标签内嵌套多层标签,则返回None

  1. import requests
  2. from bs4 import BeautifulSoup
  3. r = requests.get('http://www.baidu.com')
  4. r.encoding = 'utf-8'
  5. soup = BeautifulSoup(r.text)
  6. print('title的名字',soup.title.name) ##输出title的名字
  7. print('title包含的文本内容',soup.title.string) ##输出title包含的文本内容
  8. print('soup.title.parent.name:',soup.title.parent.name)
  9. print('soup.p:',soup.p)
  10. print('第一个超链接:',soup.a) ##返回第一个超链接
  11. print('超链接的所有属性: ',soup.a.attrs) ##返回超链接的所有属性
  12. print('返回最内层标签的内容:',soup.a.string) ##多次嵌套,返回最内层标签的内容
  13. print('该标签下所有标签的内容:',soup.p.contents) ##返回该标签下所有标签的内容
  14. print("所有的超链接:",soup.find_all('a'))
  15. ##结果
  16. title的名字 title
  17. title包含的文本内容 百度一下,你就知道
  18. soup.title.parent.name: head
  19. soup.p: <p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p>
  20. 第一个超链接: <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
  21. 超链接的所有属性: {'href': 'http://news.baidu.com', 'name': 'tj_trnews', 'class': ['mnav']}
  22. 返回最内层标签的内容: 新闻
  23. 该标签下所有标签的内容: [' ', <a href="http://home.baidu.com">关于百度</a>, ' ', <a href="http://ir.baidu.com">About Baidu</a>, ' ']
  24. 所有的超链接: [<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&amp;tpl=mn&amp;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">关于百度
  25. </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/">意
  26. 见反馈</a>]

2.3 实例

  1. ##爬取淘宝网首页的中文产品类别
  2. import requests
  3. from bs4 import BeautifulSoup
  4. r = requests.get('http://taobao.com')
  5. r.encoding='utf-8'
  6. soup = BeautifulSoup(r.text,"html.parser")
  7. for list in soup.find_all('a'): ##匹配被封装在<a></a>之间的结构,如果不为空,就输出
  8. if not list.string == None:
  9. print(list.string)
  10. ##结果
  11. 已买到的宝贝
  12. 我的足迹
  13. 收藏的宝贝
  14. 收藏的店铺
  15. 免费开店
  16. 已卖出的宝贝
  17. 出售中的宝贝
  18. 卖家服务市场
  19. 卖家培训中心
  20. 体检中心
  21. 问商友
  22. 消费者客服
  23. 卖家客服
  24. 淘宝网
  25. 淘宝网
  26. 新款连衣裙
  27. 四件套
  28. 潮流T
  29. 时尚女鞋
  30. 短裤
  31. 半身裙
  32. 男士外套
  33. 墙纸
  34. 行车记录仪
  35. 新款男鞋
  36. 耳机
  37. 时尚女包
  38. 沙发
  39. 天猫
  40. 聚划算
  41. 天猫超市
  42. 司法拍卖
  43. 淘宝心选
  44. 飞猪旅行
  45. 智能生活
  46. 苏宁易购
  47. 女装
  48. 内衣
  49. 家居
  50. 女鞋
  51. 男鞋
  52. 箱包
  53. 母婴
  54. 童装
  55. 玩具
  56. 男装
  57. 运动户外
  58. 美妆
  59. 彩妆
  60. 个护
  61. 手机
  62. 数码
  63. 企业
  64. 大家电
  65. 生活电器
  66. 零食
  67. 生鲜
  68. 茶酒
  69. 厨具
  70. 收纳
  71. 清洁
  72. 家纺
  73. 家饰
  74. 鲜花
  75. 图书音像
  76. 文具
  77. 医药保健
  78. 进口
  79. 汽车
  80. 二手车
  81. 用品
  82. 房产
  83. 装修家具
  84. 建材
  85. 手表
  86. 眼镜
  87. 珠宝饰品
  88. 登录
  89. 注册
  90. 开店
  91. 公告
  92. 规则
  93. 论坛
  94. 安全
  95. 公益
  96. 关于开展打击网络“有偿删帖”和“软色情”专项的公告
  97. 淘宝造物节之城市秘密
  98. 聚划算88红包省钱卡
  99. 95公益周阿里、腾讯等六家公司同台联合做公益
  1. 抓取糗事百科的热门段子
  2. import requests
  3. from bs4 import BeautifulSoup
  4. response = requests.get('http://www.qiushibaike.com')
  5. content = response.content
  6. soup = BeautifulSoup(content, "html.parser")
  7. print(response.status_code)
  8. for div in soup.find_all('div'): ##匹配被封装在<div></div>之间的文本内容,如果不为空,就输出
  9. print(div.text.strip()) #string.strip([chars]) 方法删除字符串开头和结尾指定的字符或字符序列 (即不能删中间字符)。
  10. ##结果
  11. QQ空间
  12. 手机扫描二维码关注
  13. 互联网ICP备案:京ICP14028348号-1
  14. 广播电视节目制作经营许可证:(京)字第08319
  15. 网络文化经营许可证:
  16. 京网文[2020]0625-100
  17. 增值电信业务经营许可证:京ICP140448
  18. 计算机信息网络国际联网单位备案:京公网安备11010502031601
  19. 网上有害信息举报专区
  20. 违法和不良信息举报电话:18126520579
  21. 邮箱:kefu@qiushibaike.com
  22. 友际无限(北京)科技有限公司
  23. © Qiushibaike.com 糗事百科版权所有