参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1019223241745024

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,此模块使用起来更方便

  参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1183249464292448

  使用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

  参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017784095418144

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

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

  注意使用attrs这个值

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

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

  

  会产生3个事件:

  1. start_element事件,在读取<a href="/">时;

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

  3. end_element事件,在读取</a>时。

  什么是事件呢?

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

  参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017784593019776

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

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

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

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

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

from html.parser import HTMLParser
from html.entities import name2codepoint class 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这个值

def find_id(self,id_name,attrs):
for i in attrs:
if id_name in i:
return True
return False def handle_starttag(self, tag, attrs):
if self.find_id('test1',attrs):
print('<%s%s>' %(tag,str(attrs)))
pass parser.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

  

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

Python urllib与requests、XML和HTMLParser的更多相关文章

  1. Python全栈--7模块--random os sys time datetime hashlib pickle json requests xml

    模块分为三种: 自定义模块 内置模块 开源模块 一.安装第三方模块 # python 安装第三方模块 # 加入环境变量 : 右键计算机---属性---高级设置---环境变量---path--分号+py ...

  2. Python模块之requests,urllib和re

    目录 一.爬虫的步骤 二.使用Jupyter 三.爬虫请求模块之urllib 四.爬虫请求模块之requests 五.爬虫分析之re模块 一.爬虫的步骤 1.发起请求,模拟浏览器发送一个http请求 ...

  3. python基础-7模块,第三方模块安装方法,使用方法。sys.path os sys time datetime hashlib pickle json requests xml

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  4. Python使用urllib,urllib3,requests库+beautifulsoup爬取网页

    Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...

  5. 【Python爬虫实战--1】深入理解urllib;urllib2;requests

    摘自:http://1oscar.github.io/blog/2015/07/05/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3urllib;urllib2;reques ...

  6. Python 网络请求模块 urllib 、requests

    Python 给人的印象是抓取网页非常方便,提供这种生产力的,主要依靠的就是 urllib.requests这两个模块. urlib 介绍 urllib.request 提供了一个 urlopen 函 ...

  7. 人生苦短之Python的urllib urllib2 requests

    在Python中涉及到URL请求相关的操作涉及到模块有urllib,urllib2,requests,其中urllib和urllib2是Python自带的HTTP访问标准库,requsets是第三方库 ...

  8. Python urllib Request 用法

    转载自:https://blog.csdn.net/ywy0ywy/article/details/52733839 python2.7 httplib, urllib, urllib2, reque ...

  9. python第三方库requests简单介绍

    一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...

随机推荐

  1. JavaWeb之Cookie&Session

    Cookie 直译是:小饼干.实际上,Cookie就是由服务器给客户端,并且存储在客户端上的一份小数据 应用场景 自动登录,查看浏览记录,购物车 Cookie存在的意义 HTTP请求是无状态的,客户端 ...

  2. 什么是POSP?系统逻辑是什么?pos收单必读

    POSProxy,POS前置系统.主要用于管理前端的POS机具和交易的转发,具体功能有:   1. POS机具的密钥及下载管理:   2. 交易的合法检测和过滤:   3. 交易监控和分流:   4. ...

  3. Java collection 集合类架构

    https://www.cnblogs.com/fireflyupup/p/4875130.html Collection List 在Collection的基础上引入了有序的概念,位置精确:允许相同 ...

  4. ABP进阶教程8 - 自定义按钮

    点这里进入ABP进阶教程目录 在功能按钮区增加一个自定义按钮 - Add(创建课程) 添加按钮 打开展示层(即JD.CRS.Web.Mvc)的\wwwroot\view-resources\Views ...

  5. nRF24L01+启用自动应答ACK及自动重发的实战分享

    ACK模式(自动应答)功能的官方说明 当用W_TX_PAYLOAD命令对发送端TX FIFO写数据时,将数据打包后,数据包中包控制字段NO_ACK 标志位复位.接收端接收到一帧有效数据后, 产生RX_ ...

  6. Flask request接口获取参数

    Flask request接口获取参数   request.form.get("key", type=str, default=None) 获取表单数据, request.args ...

  7. Div转为Canvas简直不要太好玩~~~

    html2canvas库 今天发现了一个神奇的玩意,简直不要太好玩~~ 用canvas做动画是很难,但是div能比canvas简单不少,只是因为canvas中不能操作Dom元素 这款神器,可以直接将D ...

  8. /usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child

    https://www.jb51.net/article/142787.htm gn gn  问题如何解决?????

  9. 智能指针类模板(中)——Qt中的智能指针

    Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...

  10. day8_对象的交互

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/14 15:07 # @Author : 大坏男孩 # @File : d ...