Python 的内建模块urllib提供了一系列用于操作url的方法

Get
urllib的request可以非常方便的抓取URL的内容,通过GET发送一个请求到指定页面,然后返回HTTP响应

还可以模仿浏览器发送一个GET请求,需要request对象,通过向request对象中添加HTTP请求头,就可以把请求伪装为一个浏览器

Post
需要把参数以bytes类型传入

Handler
如果还需要更复杂的控制,加入需要通过一个代理去登陆网站,需要使用proxyhandler模块

urllib提供的功能就是通过程序完成各种各样的HTTP请求,如果需要模仿浏览器完成特定功能,需要将请求伪装为浏览器请求,伪装的方法是先监控浏览器发出的请求,然后再根据浏览器的请求头来伪装,User-Agent头就是用来识别浏览器的

requests
requests是用于操作URl的第三方模块,相比Python提供的内建模块urllib,此模块使用起来更方便

使用GET访问一个页面

  • 使用params参数传入一个dict类型的参数做为访问url的参数

  • 使用headers参数,传入一个dict类型的参数作为请求头

requests默认使用application/x-www-form-urlencoded对POST数据编码。如果要传递JSON数据,可以直接传给json参数

params = {'key': 'value'}
r = requests.post(url, json=params) # 内部自动序列化为JSON

如果需要上传文件,可以直接将一个file对象传给files参数

>>> upload_files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=upload_files)

在读取文件时,注意务必使用’rb’即二进制模式读取,这样获取的bytes长度才是文件的长度。

把post()方法替换为put(),delete()等,就可以以PUT或DELETE方式请求资源。

除了能轻松获取响应内容外,requests对获取HTTP响应的其他信息也非常简单。

例如,获取响应头

>>> r.headers
{Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}
>>> r.headers['Content-Type']
'text/html; charset=utf-8'

requests对Cookie做了特殊处理,使得我们不必解析Cookie就可以轻松获取指定的Cookie

>>> r.cookies['ts']
'example_cookie_12345'

要在请求中传入Cookie,只需准备一个dict传入cookies参数

可以使用encoding属性查看编码

无论响应的内容是文本或者二进制文件,都可以使用content属性获取其bytes对象

如果响应的是特定的类型,比如Json,可以使用json()方法直接获取

最后,要指定超时,传入以秒为单位的timeout参数:

>>> r = requests.get(url, timeout=2.5) # 2.5秒后超时

XML

操作XML有两种方法:DOM和SAX。DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。

正常情况下,优先考虑SAX,因为DOM实在太占内存。

注意使用attrs这个值

当SAX解析器读到一个节点时:

<a href="/">python</a>

会产生3个事件:

  1. start_element事件,在读取时;

  2. char_data事件,在读取python时;

  3. end_element事件,在读取时。

什么是事件呢?

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from xml.parsers.expat import ParserCreate
class DefaultSaxHandler(object):def start_element(self,name,attrs):print('sax:start_element:%s,attrs:%s'%(name,str(attrs)))#这里可以写 当读到这里时要发生的事件def end_element(self,name):print('sax:end_element:%s'%name)#这里可以写 当读到这里时要发生的事件def char_data(self,text):print('sax:char_data:%s'%text)#这里可以写 当读到这里时要发生的事件
xml = r'''<?xml version="1.0"?>
<ol><li><a href="/python">Python</a></li><li><a href="/ruby">Ruby</a></li>
</ol>
'''
handler=DefaultSaxHandler()
parser=ParserCreate()
parser.StartElementHandler=handler.start_element
parser.EndElementHandler=handler.end_element
parser.CharacterDataHandler=handler.char_data
parser.Parse(xml)
#输出
sax:start_element:ol,attrs:{}
sax:char_data:sax:char_data:
sax:start_element:li,attrs:{}
sax:start_element:a,attrs:{'href': '/python'}
sax:char_data:Python
sax:end_element:a
sax:end_element:li
sax:char_data:sax:char_data:
sax:start_element:li,attrs:{}
sax:start_element:a,attrs:{'href': '/ruby'}
sax:char_data:Ruby
sax:end_element:a
sax:end_element:li
sax:char_data:sax:end_element:ol

需要注意的是读取一大段字符串时,CharacterDataHandler可能被多次调用,所以需要自己保存起来,在EndElementHandler里面再合并。

除了解析XML外,如何生成XML呢?99%的情况下需要生成的XML结构都是非常简单的,因此,最简单也是最有效的生成XML的方法是拼接字符串:

如果要生成复杂的XML呢?建议你不要用XML,改成JSON。

解析XML时,注意找出自己感兴趣的节点,响应事件时,把节点数据保存起来。解析完毕后,就可以处理数据。

比如可以解析XML数据获得相关城市的天气信息(略)

HTMLParser

当我们爬取了网页,下一步就是解析HTML页面,看看里面的内容,到底是图片、视频还是文本。

利用HTMLParser,可以把网页中的文本、图像等解析出来。

HTML本质上是XML的子集,但是语法没有XML要求的那么严格,所以不能通过标准的DOM或者SAX来解析HTML

好在Python提供了HTMLParser来非常方便地解析HTML,只需简单几行代码:

注意使用attrs这个值,可以用来抽取链接、识别id为某个值元素

from html.parser import HTMLParser
from html.entities import name2codepointclass MyHTMLParser(HTMLParser):def handle_starttag(self, tag, attrs):print('<%s>' % tag)def handle_endtag(self, tag):print('</%s>' % tag)def handle_startendtag(self, tag, attrs):print('<%s/>' % tag)#如img标签<img src="",alt=""/>def handle_data(self, data):print(data)def handle_comment(self, data):print('<!--', data, '-->')def handle_entityref(self, name):#解析特殊字符print('&%s;' % name)def handle_charref(self, name):#解析特殊字符print('&#%s;' % name)parser = MyHTMLParser()
parser.feed('''<html>
<head></head>
<body>
<!-- test html parser --><p>Some <a href=\"#\">html</a> HTML tutorial...<br>END</p>
</body></html>''')
#输出
(sort) λ python fortest.py
<html><head>
</head><body><!--  test html parser  --><p>
Some
<a>
html
</a>HTML tutorial...
<br>
END
</p></body>
</html>

feed()方法可以多次调用,也就是不一定一次把整个HTML字符串都塞进去,可以一部分一部分塞进去。

可是这样怎么识别有特定id的标签呢?,注意使用attrs这个值

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def find_id(self,id_name,attrs):for i in attrs:if id_name in i:return Truereturn Falsedef handle_starttag(self, tag, attrs):if self.find_id('test1',attrs):print('<%s%s>' %(tag,str(attrs)))passparser.feed('''<html>
<head></head>
<body>
<!-- test html parser --><p class='test' id='test1'>Some <a href=\"#\">html</a> HTML tutorial...<br>END</p>
</body></html>''')#输出
pass
<p[('class', 'test'), ('id', 'test1')]>
pass

特殊字符有两种,一种是英文表示的 ,一种是数字表示的Ӓ,这两种字符都可以通过Parser解析出来。

Python urllib与requests、XML和HTMLParser相关推荐

  1. pool python 传参数_Python-爬虫-多线程、线程池模拟(urllib、requests、UserAgent、超时等)...

    接着之前的MonkeyLei:Python-爬取页面内容(涉及urllib.requests.UserAgent.Json等) 继续练习下多线程,线程池模拟.. 我想这样: 1. 创建一个线程池,线程 ...

  2. 自学Python第十四天- 一些有用的模块:urllib、requests 网络编程基础,向爬虫靠拢

    自学Python第十四天- 一些有用的模块:urllib.requests 网络编程基础,向爬虫靠拢 fake_useragent 库 安装 fake_useragent 使用 urllib 库 ur ...

  3. Python爬虫之urllib和requests哪个好用--urllib和requests的区别

    我们讲了requests的用法以及利用requests简单爬取.保存网页的方法,这节课我们主要讲urllib和requests的区别. 1.获取网页数据 第一步,引入模块. 两者引入的模块是不一样的, ...

  4. pythonrequests发送数据_在python中使用requests 模拟浏览器发送请求数据的方法

    在python中使用requests 模拟浏览器发送请求数据的方法 如下所示: import requests url='http://####' proxy={'http':'http://#### ...

  5. python怎么安装requests库-python怎么安装requests库

    requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装pip install requests 安装完成后import一下, ...

  6. python urllib dns 缓存_新手用Python做一个网页爬虫

    咱们好哈,最近博主在学习Python,学习时期也遇到一些问题,获得了一些经历,在此将自个的学习体系地整理下来,假如咱们有爱好学习爬虫的话,能够将这些文章作为参阅,也期待咱们总共同享学习经历. 首要py ...

  7. Python urllib – Python 3 urllib

    Python urllib module allows us to access URL data programmatically. Python urllib模块允许我们以编程方式访问URL数据. ...

  8. 第三部分 基本库的使用(urllib库, requests库, re库)

    Python提供了功能齐全的类库来完成网络请求.基础库的HTTP库有urllib, httplib2, requests, treq等. 比如说rullib库,不用关心底层怎么实现的,只要关心请求的链 ...

  9. python之利用requests库爬取西刺代理,并检验IP的活性

    用爬虫爬取某个网站的数据时,如果用一个IP频繁的向该网站请求大量数据,那么你的ip就可能会被该网站拉入黑名单,导致你不能访问该网站,这个时候就需要用到IP动态代理,即让爬虫爬取一定数据后更换IP来继续 ...

最新文章

  1. using的几种用途
  2. 增强MyEclipse的代码自动提示功能(测试结果不是很爽)
  3. RabbitMQ 镜像集群队列_集群高可用篇_03
  4. SpringCloud注解和配置以及pom依赖说明
  5. 2016年3月8日----Javascript的函数
  6. JavaScript-4函数
  7. 【Mac版】小i译读安装操作
  8. 谷歌浏览器无法定位程序输入点解决方法
  9. python对数据进行分类_按Python对数据进行分类
  10. Win10企业版系统安装 NET Framework 4.8的时候提示错误信息
  11. java ee论文_基于JavaEE的项目管理系统毕业论文.doc
  12. Java 并发编程(一) 学习教程
  13. spring boot runner,destory监听
  14. 高效遍历HashMap的方式,你知道的有几种呢
  15. 第3章 Pandas数据处理(3.7-3.8)_Python数据科学手册学习笔记
  16. java照片切换播放音乐_音乐播放器-图片切换-轮播图效果
  17. OData的初步认识
  18. 职业规划-数据库工程师(Database Engineer)
  19. 信息增益matlab实现,python中如何实现信息增益和信息增益率
  20. 麻省理工学院——人工智能公开课04

热门文章

  1. CentOS 6.3 64bit 搭建vsFTP服务
  2. w3school-html教程笔记-1-20140227
  3. Nebula3学习笔记(6): 网络系统
  4. 计划订单号码范围用完导致MRP无法运行
  5. SAP设置信贷控制范围有什么作用?
  6. ERP兵法——从案例透视方法(实施篇上)
  7. 联想618首战告捷,是战略潜力的释放还是最后的“狂欢”?
  8. 在线音乐用户寄望用爱发电,资本不愿无米之炊
  9. php管理用户名和密码,管理员用户名/密码不适用于PHP
  10. 台安变频器n2按键说明_台安变频器N2型号说明参数设置故障代码及故障解决方法...