版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Python程序设计程序设计从基础到开发从基础到开发 夏敏捷夏敏捷 杨关杨关 主编主编 清华大学出版社清华大学出版社第第12章章 Python爬取网页信息爬取网页信息主讲主讲 夏敏捷夏敏捷计算机学院副教授计算机学院副教授12.1 相关HTTP协议知识 HTTP工作流程12.1 相关HTTP协议知识 而我们现在的一般使用的HTTP 1.1协议解析网页过程是不同的,在1.1版本中同一个连接可以包含多个请求和对应响应。但是其原理是不变的。如图:网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。是搜索引擎抓取系统的重要组成部分。爬虫
2、的主要目的是将互联网的网页下载到本地形成一个互联网内容的镜像备份。URL就是统一资源定位符(Uniform Resource Locator),它的一般格式如下:protocol :/ hostname:port / path / ;parameters?query#fragmentURL的格式由三部分组成:(1)protocol:第一部分就是协议,例如百度使用的就是https协议;(2)hostname:port:第二部分就是主机名(还有端口号为可选参数),一般网站默认的端口号为80,例如百度的主机名就是,这个就是服务器的地址;(3)path:第三部分就是主机资源的具体地址,如目录和文件名等
3、。网络爬虫应用一般分为两个步骤:通过网络链接获取网页内容;对获得的网页内容进行处理。网络爬虫urllib是Python标准库中最为常用的Python网页访问的模块,我们可以使用urlib这个库抓取网页。12.2 urllib库urllib是一个URL处理包,这个包中集合了一些处理URL的模块,如下:(1)urllib.request模块是用来打开和读取URL的;(2)urllib.error模块包含一些有urllib.request产生的错误,可以使用try进行捕捉处理;(3)urllib.parse模块包含了一些解析URL的方法;(4)urllib.robotparser模块用来解析robo
4、ts.txt文本文件。它提供了一个单独的RobotFileParser类,通过该类提供的can_fetch()方法测试爬虫是否可以下载一个页面。1 1获取网页信息获取网页信息urllib.request和urllib.parse模块urlopen()函数格式:urllib.urlopen(url, data, proxies)urlopen返回的response对象提供了如下方法:read(), readline(), readlines(), fileno(), close():这些方法的使用方式与文件对象完全一样;info():返回一个httplib.HTTPMessage对象,表示远程服
5、务器返回的头信息;getcode():返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到;geturl():返回请求的url;1 1获取网页信息获取网页信息urllib.request和urllib.parse模块 urlopen()函数格式:urllib.urlopen(url, data, proxies) url参数不仅可以是一个字符串,例如:http:/。url也可以是一个Request对象 req = request.Request(http:/ #Request对象 response = request.urlopen(req) html = re
6、sponse.read() html = html.decode(utf-8) print(html)注意,如果要把对应文件下载到本地,可以使用urlretrieve()函数。from urllib import requestrequest.urlretrieve(http:/ 2获取服务器响应信息获取服务器响应信息urllib.request和urllib.parse模块 request.urlopen()代表请求过程,它返回的HTTPResponse对象代表响应。 HTTPResponse对象status属性返回请求HTTP后的状态,在处理数据之前要先判断状态情况。如果请求未被响应,需要
7、终止内容处理。reason属性非常重要,可以得到未被响应的原因,url属性是返回页面URL。 HTTPResponse.read()是获取请求的页面内容的二进制形式。3 3向服务器发送数据向服务器发送数据urllib.request和urllib.parse模块GET也可以提交,与POST的区别如下。1) GET方式可以通过URL提交数据,待提交数据是URL的一部分;采用POST方式,待提交数据放置在HTML HEADER内。2) GET方式提交的数据最多不超过1024二字节,POST没有对提交内容的长度限制。如果没有设置urlopen()函数的data参数,HTTP请求采用GET方式,也就是
8、我们从服务器获取信息,如果我们设置data参数,HTTP请求采用POST方式,也就是我们向服务器传递数据。data参数有自己的格式,具体格式我们不用了解,因为我们可以使用urllib.parse.urlencode()函数将字符串自动转换成上面所说的格式。下面是发送data实例,向“百度翻译”发送要翻译数据data,得到翻译结果。urllib.request和urllib.parse模块 #创建Form_Data字典,存储向服务器发送的Data Form_Data=from:en,to:zh,query:en_str,transtype:hash #创建Form_Data字典,存储向服务器发送
9、的Data Form_Data = Form_Datafrom = en Form_Datato = zh Form_Dataquery = en_str #要翻译数据 Form_Datatranstype = hashURL = http:/ data = parse.urlencode(Form_Data).encode(utf-8) #使用urlencode方法转换标准格式 response = request.urlopen(URL,data) #传递Request对象和转换完格式的数据 html = response.read().decode(utf-8) #读取信息并解码 tra
10、nslate_results = json.loads(html) #使用JSON #print(translate_results) #打印出JSON数据 translate_results = translate_resultstrans_resultdata0dst #找到翻译结果 print(翻译的结果是:%s % translate_results) #打印翻译信息我们得到的JSON数据如下:logid: 4137673849, liju_result: double: , single: , trans_result: from: en, domain: all, keywords
11、: , phonetic: src_str: 美, trg_str: mi, src_str: 丽, trg_str: l, src_str: 的, trg_str: de, to: zh, data: result: 0, 美丽的, 0|8, , 0|8, 0|9, relation: , src: beatiful, dst: 美丽的, status: 0, type: 2, dict_result: 向“百度翻译”发送要翻译数据4使用User Agent隐藏身份 通过设置User Agent的来达到隐藏身份的目的,User Agent的中文名为用户代理,简称UA。User Agent存放
12、于Headers中,服务器就是通过查看Headers中的User Agent来判断是谁在访问。想要设置User Agent,有两种方法:1.在创建Request对象的时候,填入headers参数(包含User Agent信息),这个Headers参数要求为字典;2.在创建Request对象的时候不添加headers参数,在创建完成之后,使用add_header()的方法,添加headers。urllib.request和urllib.parse模块4使用User Agent隐藏身份 通过设置User Agent的来达到隐藏身份的目的,User Agent的中文名为用户代理,简称UA。User
13、Agent存放于Headers中,服务器就是通过查看Headers中的User Agent来判断是谁在访问。想要设置User Agent,有两种方法:1.在创建Request对象的时候,填入headers参数(包含User Agent信息),这个Headers参数要求为字典;2.在创建Request对象的时候不添加headers参数,在创建完成之后,使用add_header()的方法,添加headers。urllib.request和urllib.parse模4使用User Agent隐藏身份 方法一:from urllib import requestif _name_ = _main_:
14、#以CSDN为例,CSDN不更改User Agent是无法访问的 url = http:/ head = #写入User Agent信息 headUser-Agent = Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 req = request.Request(url, headers=head) #创建Request对象 response = request.urlopen(re
15、q) #传入创建好的Request对象 html = response.read().decode(utf-8) #读取响应信息并解码 print(html) #打印信息urllib.request和urllib.parse模块4使用User Agent隐藏身份 from urllib import requestif _name_ = _main_: #以CSDN为例,CSDN不更改User Agent是无法访问的 url = http:/ req = request.Request(url) #创建Request对象 req.add_header(User-Agent, Mozilla/5
16、.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19) #传入headers response = request.urlopen(req) #传入创建好的Request对象 html = response.read().decode(utf-8) #读取响应信息并解码 print(html) #打印信息urllib.request和urllib.parse模块12.3 BeautifulSoup库 Bea
17、utifulSoup(英文原意是美丽的蝴蝶)是一个 Python 处理HTML/XML 的函数库,是Python内置的网页分析工具,用来快速地转换被抓取的网页。它产生一个转换后DOM树,尽可能和原文档内容含义一致,这种措施通常能够满足你搜集数据的需求。 BeautifulSoup 提供一些简单的方法以及类Python语法来查找、定位、修改一棵转换后DOM树。 使用pip直接安装beautifulsoup4: pip3 install beautifulsoup4BeautifulSoup库的四大对象TagNavigableStringBeautifulSoup(前面例子中已经使用过)Comme
18、ntTag对象就是 HTML中的一个个标签,例如 The story of Monkey Elsie上面的 等等 HTML标签加上里面包括的内容就是Tag,下面用Beautiful Soup来获取Tags。print (soup.title)print (soup.head)NavigableString对象我们已经得到了标签的内容,要想获取标签内部的文字怎么办呢?很简单,用.string即可,例如soup. title.string这样我们就轻松获取到了标签里面的内容,如果用正则表达式则麻烦的多。BeautifulSoup对象(3)BeautifulSoup对象BeautifulSoup对象
19、表示的是一个文档的全部内容。大部分时候可以把它当作 Tag 对象,是一个特殊的Tag,下面代码可以分别获取它的类型,名称,以及属性。print (type(soup) #输出:print ( ) #输出:documentprint (soup.attrs ) #输出空字典: Comment对象(4)Comment对象Comment 注释对象是一个特殊类型的 NavigableString 对象,其内容不包括注释符号,如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。BeautifulSoup库操作解析文档树1 1遍历文档树遍历文档树2 2搜索文档树搜索文档树3 3用
20、用CSSCSS选择器筛选元素选择器筛选元素BeautifulSoup库操作解析文档树1 1遍历文档树遍历文档树2 2搜索文档树搜索文档树3 3用用CSSCSS选择器筛选元素选择器筛选元素BeautifulSoup库操作解析文档树1 1遍历文档树遍历文档树(1).content 属性和.children属性获取直接子节点(2).descendants 属性获取所有子孙节点(3)节点内容.string(4)多个内容.strings(5)父节点.parent(6)兄弟节点,.next_sibling 属性获取了该节点的下一个兄弟节点,.previous_sibling 则与之相反,如果节点不存在,则返回 None。BeautifulSoup库操作解析文档树2 2搜索文档树搜索文档树(1)find_all( name , attrs , recursive , text , *kwargs )find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件(2)find( name , attrs , recursive , text )它与
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025劳动合同协议书范文
- 租房合同怎样盖章才有效(3篇)
- 2025租赁合同范本标准版:租房合同协议
- 2025解除租赁合同申请书
- 2019年4月2日辽宁省沈阳市纪委监委遴选面试真题
- 雨课堂学堂云在线《Clinical Physiology(汕头大学 )》单元测试考核答案
- DB11-T 557-2023 设施农业节水灌溉工程技术规程
- DB3205-T 1035-2021 基于急性呼吸道传染病疫情防控的保安服务规范
- 2025关于有担保人的土地使用权转让合同范本
- 2025年血站上岗证考试真题及答案
- 住房公积金追缴授权委托书
- 九三学社 入 社 申 请 表
- 三级安全教育登记卡(新)
- 《工贸企业重大事故隐患判定标准》
- 超声基础知识及临床应用演示
- 2022-2023部编新人教版小学6六年级数学上册(全册)教案
- 手电筒产品课程设计报告书
- 有机化学期中考试试题及参考答案
- 滕王阁序注音全文打印版
- FZ/T 01057.2-2007纺织纤维鉴别试验方法 第2部分:燃烧法
- 四川大学经济学院党政办公室工作人员招考聘用2人【共500题附答案解析】模拟检测试卷
评论
0/150
提交评论