接上篇博客:Python网络爬虫与信息提取笔记(文末附教学视频)

14:基于bs4库的HTML内容遍历方法

标签树的下行遍历:



用len(soup.body.contents)返回body标签的儿子节点的数量。
用soup.body.contents[1]来获取第一个元素

标签树的下行遍历代码:

标签树的上行遍历:
.parent
.parents




在遍历时,会遍历到soup标签,但soup标签没有父类,故使用
if parent is None: 来做一个区分。
标签树的平行遍历:




15:基于bs4库的HTML格式化和编码

如何能够让html页面更加友好的显示:在bs4库中提供了一个方法:prettify()方法,prettify()能够为每一个标签后添加一个换行:

打印一下soup.prettify():

编码
bs4库将任何读入的HTML文件或字符串都转换成了utf-8编码。

单元小结:

16:信息标记的三种形式

标记后的信息可形成信息组织结构,增加了信息维度
标记后的信息可用于通信、存储和展示
标记的结构与信息一样具有重要价值
标记后的信息更利于程序理解和运用
HTML的信息标记:
HTML通过预定义的<>…</>标签形式组织不同类型的信息。
现在国际公认的信息标记的三种形式为:XML、JSON、YAML
XML::当<>…</>之间有内容时,我们用两个<>…</>来包含,当没有内容时,用一个就可以。<>中也可以包括注释。

JSON:JavaScript语言中对面向对象语言的一种表达形式。
简单讲JSON时有类型的键值对 key: value 构建的信息表达方式,如对信息类型的定义叫键key,对信息值的描述叫值value
“name”: “经贸大学”
"name"是key,"经贸大学"是值
当一个键对应多个值时:


YAML:
无类型键值对key : value
name : 经贸大学
用缩进表示所属关系:



text: | #学校介绍
文本内容…
都属于text的范畴。

17:信息提取的一般方法

信息提取指从标记后的信息中提取所关注的内容。
**方法一:**完整解析信息的标记形式,再提取关键信息。
简单说,我们用标记解析器去解析XML、JSON、YAML格式,然后将其中所需要的信息提取出来。比如bs4库提供了对标签树的遍历,我们需要什么信息,去遍历这棵树就可以了。这种方法优点是:信息解析准确。缺点是:提取过程繁琐,速度慢,也需要对整个文件的信息组织形式有个清楚的认识和理解。
**方法二:**无视标记形式,直接搜索关键信息。类似于word查找文本。
对信息的文本利用查找函数查找即可。优点是:提取过程简介,速度较快。缺点是:提取结果准确性与信息内容相关。
从实际使用中最好的方法是一种融合方法。
融合方法

实例
提取HTML中所有URL链接
思路:(1)搜索到所有的< a>标签
(2)解析< a>标签格式,提取href后的链接内容

18:基于bs4库的HTML内容查找方法

回顾demo.html

Beautiful Soup库提供了一个方法:
<>.find_all(name, attrs, recursive, string, **kwargs)
可以在soup的变量中查找里边的信息,find_all()方法返回一个列表类型,存储查找的结果。
name:对标签名称的检索字符串


当传入参数为True时,find_all()返回所有标签。用tag.name来显示标签名称。

若只想要显示以b开头的标签,如< b>< body>等。需要用到正则表达式。

import re
import requests
from bs4 import BeautifulSoup
r = requests.get("https://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
for tag in soup.find_all(re.compile('b'))print(tag.name)# 输出为:
# body
# b

attrs:对标签属性值的检索字符串,可标注属性检索。

recursive

string

简写形式:

扩展方法:

19:中国大学排名定向爬虫实例

功能描述:
输入:大学排名url链接
输出:大学排名信息的屏幕输出(排名,大学名称,总分)
技术路线:requests-bs4(无法获取动态脚本信息)
结构设计:


爬取中国最好大学排名:
打开网页,先看robots.txt,404说明不限制爬虫爬取
查看源代码:

发现所有的大学信息在< tbody>标签中,每一个大学的信息又在< tr>标签中存储。
每所大学的排名、名称,分数都在< td>标签中存储。
使用下述代码爬取:

import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):"""getHtmlText(url)在main()函数调用时,传入url参数,对url进行requests.get()请     求,判断请求的状态码,将检测内容推断出的编码格式赋值给r.encoding,返回r.text,即html的内容"""try:r = requests.get(url)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return ""def fillUnivList(ulist, html):"""fillUnivList(ulist, html)函数在main()函数调用时,将实参变量uinfo = [],和html传入,使用类产生soup对象用于存储使用'html.parser'解析器解析后的html变量的内容。"""soup = BeautifulSoup(html, "html.parser")# find()方法搜索且只返回一个结果,且是字符串类型# 因为只有一个< tbody>标签,所以用find(),不用find_all()方法# 使用变量tr遍历tbody标签的子标签:所有的tr标签# 但因为子节点的遍历中可能存在NavigableString类型,代码下方图一# 这里不懂参考14单元下的平行遍历下的代码# 故用if isinstance(tr, bs4.element.Tag)筛选tag类型的tr变量for tr in soup.find('tbody').children:print(tr)if isinstance(tr, bs4.element.Tag):# 这里tr是<class 'bs4.element.Tag'>类型的变量# tr('td')是tr.find_all('td')的简写形式,返回一个列表,参照图二tds = tr('td')print(tds)# 将第一个< td>标签的内容,第二个,第四个td标签的内容作为一个列表# 写入到列表ulist中ulist.append([tds[0].string, tds[1].string, tds[3].string])def printUnivList(ulist, num):# 格式化输出print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))for i in range(num):将ulist中的每一个列表遍历一遍u = ulist[i]print(u)# 输出列表u中的信息print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))def main():uinfo = []url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"html = getHTMLText(url)fillUnivList(uinfo, html)# 传入参数20,说明只输出前20所学校printUnivList(uinfo, 20)main()

图一:

图二:

中英文字符何合用导致对齐问题。


优化
中文对齐问题是通用问题:当中文字符宽度不够时,系统默认采用西文字符填充,加入采用中文空格填充的代码:

def printUnivList(ulist, num):# 第二个{}中仍包含一个{},表示我们使用format()中的标号为3的位置# 即chr(12288)位置标号为3进行填充,"排名"标号为0,学校名称1,总分2# 并将第二个{}中的占位符改为10,表示第二个{}一共占用十个字符的位置tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"print(tplt.format("排名", "学校名称", "总分", chr(12288)))for i in range(num):u = ulist[i]# print(u)print(tplt.format(u[0], u[1], u[2], chr(12288)))


但是这里又出现了标题和输出不对齐的问题,在名片管理系统也出现了,还未解决。(留意一下)

20:正则表达式re

完整版正则表达式的详细介绍见本人的这篇博客:
https://blog.csdn.net/qq_38132105/article/details/104269550

21:淘宝商品信息定向爬虫

注意淘宝的robots.txt不允许任何爬虫爬取,我们只在技术层面探讨这一章节的内容。

功能描述:
目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格
理解:淘宝的搜索接口
翻页的处理
技术路线:requests-re
起始页
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306
第二页
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=3&ntoffset=3&p4ppushleft=1%2C48&s=44
第三页
https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s=88


我们查看淘宝的源代码:发现,价格字段由’view_price’来标识,商品名称字段由’raw_title’来标识。因此如果我们想要获得这两个信息,只要在获得的文本中检索到其中的view_price和raw_title并把后续的相关内容提取出来即可。
从众多的文本中提取我们想要的信息,用正则表达式是非常合适的。另一个重要原因是,淘宝页面的商品信息虽然包含在html页面中,但它是一种脚本语言的体现,并不是完整的html页面的表示,它使用了动态脚本js,所以我们这里bs4库九无能为力了。

按嵩老师给的方法,现在已经不能够爬取内容。

需要模拟浏览器的header,也可以说是cookie,如下所示:
(1):首先登陆自己的淘宝账户
(2):在淘宝首页搜索书包
(3):在下方界面右键点击检查(以Chrome为例)


点击network,然后不要关闭检查界面,点击浏览器的刷新按钮,这时会出现很多文件

在红框文件处右键,选择Copy as cURL(bash)转到网址点击:https://curl.trillworks.com/,不要关闭淘宝界面,因为界面关闭后cookie只能维持一小段时间。关机之后爬取仍需重新粘贴新的headers

将复制内容,粘贴到curl command,可以规范代码格式。再复制Python requests里的headers = {

}里的内容即可,放到自己的代码中。

完整代码:

import requests
import redef getHTMLText(url):try:# 下方的空的字符串填上自己的浏览器生成的内容header = {'authority': '','cache-control': '','upgrade-insecure-requests': '','user-agent': '','accept': '','referer': '','accept-encoding': '','accept-language': '','cookie': '',}r = requests.get(url, headers = header)r.raise_for_status()r.encoding = r.apparent_encoding# print(r.request.headers)return r.textexcept:return ""def parserPage(ilt, html):"""parserPage()函数用来解析返回的html页面"""try:# 老师的教程上这里在原始字符串里用了转义符,可以不用,但在\.这里必须用# 因为.也是正则表达式里的一个特殊字符,用\.转义表示是真正的小数点# 用变量plt来接受findall()方法返回的列表# plt所存储的列表的内容是html中所有满足正则表达式# r'"view_price":"\d+\.\d*"'的字符串,以列表形式返回plt = re.findall(r'"view_price":"\d+\.\d*"', html)# 用变量tlt存储返回的title信息列表tlt = re.findall(r'"raw_title":".*?"', html)# 遍历列表pltfor i in range(len(plt)):# 把plt列表中的第i个字符串拿出来,并用:分割,将价格以字符串形式返回# eval()将字符串类型的价格转化为整形price = eval(plt[i].split(':')[1])# title这里可以加eval(),输出时不带引号,也可以不加,自己实验title = tlt[i].split(':')[1]# 将price和title组成的列表追加到ilt列表中ilt.append([price, title])except:print("")def printGoodsList(ilt):"""printGoodsList()函数打印商品信息"""# tplt定义了一个待格式化的字符串tplt = "{:4}\t{:8}\t{:16}"# tplt调用format()方法,按次序将字符串填入相对应的{}中print(tplt.format("序号", "价格", "商品名称"))# 定义一个计数器,用于输出序号count = 0for g in ilt:# 遍历列表iltcount += 1# 格式化输出序号count,价格g[0],商品名称g[1]print(tplt.format(count, g[0], g[1]))def main():# 定义要搜索的商品名goods = '书包'# 定义爬取的深度depth = 2# 定义爬取的urlstart_url = 'https://s.taobao.com/search?q=' + goods# 定义空列表infoList = []# 遍历每一页的内容for i in range(depth):try:url = start_url + '&s=' + str(44*i)html = getHTMLText(url)parserPage(infoList, html)except:continueprintGoodsList(infoList)main()

注意淘宝的robots.txt不允许任何爬虫爬取,我们只在技术层面探讨这一章节的内容。
仅供教学,请勿对淘宝网造成性能干扰。

未完待续…
参考文档:
北京理工大学 嵩天老师 中国大学慕课 Python网络爬虫与信息提取

Python网络爬虫与信息提取笔记(续篇)(文末附教学视频)只供教学讲解,请勿对有robots协议的网站(如淘宝网)造成骚扰相关推荐

  1. Python网络爬虫与信息提取笔记08-实例2:淘宝商品比价定向爬虫

    Python网络爬虫与信息提取笔记01-Requests库入门 Python网络爬虫与信息提取笔记02-网络爬虫之"盗亦有道" Python网络爬虫与信息提取笔记03-Reques ...

  2. python网络爬虫与信息提取_北京理工大学_Python网络爬虫与信息提取(一)

    学习 北京理工大学 嵩天 课程笔记 课程体系结构: 1.Requests框架:自动爬取HTML页面与自动网络请求提交 2.robots.txt:网络爬虫排除标准 3.BeautifulSoup框架:解 ...

  3. python 网页爬虫作业调度_第3次作业-MOOC学习笔记:Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业. 4.提供图片或网站显示的学习 ...

  4. python网络爬虫与信息提取(笔记)【未完】

    目录 python网络爬虫与信息提取 Requests库入门 HTTP协议及Requests库方法 Requests库的get()方法 Requests库的安装 Requests库主要方法解析 爬取网 ...

  5. Python网络爬虫与信息提取

    1.Requests库入门 Requests安装 用管理员身份打开命令提示符: pip install requests 测试:打开IDLE: >>> import requests ...

  6. 北京理工大学·Python网络爬虫与信息提取·知识整理

    学习目标: python爬虫部分的学习 学习内容: mooc北京理工大学·Python网络爬虫与信息提取 对Scrapy内核依然一知半解,但mooc内容已经学完整理 后续将对Scrapy继续进行学习 ...

  7. MOOC《Python网络爬虫和信息提取》(第11次)网络爬虫之框架(第4周)

    MOOC<Python网络爬虫和信息提取>(第11次)网络爬虫之框架(第4周) MOOC–Python网络爬虫和信息提取(第11次开课) 网络爬虫之框架 21.08.10 目录 文章目录 ...

  8. Python网络爬虫与信息提取—requests库入门

    requests的学习笔记 requests库自动爬取HTML页面,自动网络请求提交 此博客为中国大学MOOC北京理工大学<Python网络爬虫与信息提取>的学习笔记 requests库的 ...

  9. Python网络爬虫与信息提取(17)—— 题库爬取与整理+下载答案

    前言 上一节实现了题目的整理,没整理答案是不完整的,所以这一节加上答案的爬取. 上一节地址:Python网络爬虫与信息提取(16)-- 题库爬取与整理 效果 思路 爬答案有点难搞,像这种题库的答案都是 ...

最新文章

  1. 分布式服务跟踪及Spring Cloud的实现
  2. Mac OS X 中的脚本语言应用
  3. Android中在使用Room时提示:Cannot figure out how to save this field into database. You can consider adding a
  4. javaPNS进阶-高级推送技巧
  5. oracle数据库读取工具,用Oracle导入导出工具实现Oracle数据库移植
  6. topcoder SRM712 Div1 LR
  7. python print 输出到txt_(Python基础教程之七)Python字符串操作
  8. json、js数组真心不是想得那么简单
  9. git 空提交和重置提交者(转载)
  10. MATLAB工具箱下载地址
  11. LA 3263 That Nice Euler Circuit (2D Geometry)
  12. SAP License:SAP上线期初导入方法
  13. 图数据库_多款业界流行图数据库对比
  14. div css3 border-radius 之圆角 div圆角 图片圆角
  15. win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...
  16. 节日假期如何规划旅游?vr智慧景区让你足不出户畅游美景
  17. 汉字进行计算机识别的原理,计算机OCR文字识别技术的原理和未来发展趋势
  18. 【职场】工作上遇到的问题
  19. 【异常记录(九)】 System.Threading.ThreadAbortException: 正在中止线程
  20. 古代的”太阳“是什么意思

热门文章

  1. 电脑的文件删除了怎么恢复?就怕你不会
  2. 分析如何用金融学的知识促进修真世界、末日世界、游戏世界等世界的社会进步
  3. Fiddler Everywhere调试代理来扩大您的调试工作
  4. 5-3 Seaborn 分布绘图
  5. 【云服务器】基于docker容器部署Halo项目的个人博客搭建并部署到云服务器
  6. C-学籍和成绩管理系统(无指针版)
  7. 用Python绘制多个同心圆
  8. ChinaUnicom 中国联通wifi连接上输入联通手机号和密码后提示ip非法的解决办法
  9. qt中的绝对路径和相对路径
  10. 计算机图形学及OpenGL简介摘记