爬虫
requests
模块是Python
中发送网络请求的一款非常简洁、高效的模块。
response
对象。 参数 | 描述 |
---|---|
params | 字典,get请求的参数,value支持字符串、字典、字节(ASCII编码内) |
headers | 字典,本次请求携带的请求头 |
cookies | 字典,本次请求携带的cookies |
演示如下:
基本的post
请求参数如下:
参数 | 描述 |
---|---|
data | 字典,post请求的参数,value支持文件对象、字符串、字典、字节(ASCII编码内) |
headers | 字典,本次请求携带的请求头 |
cookies | 字典,本次请求携带的cookies |
演示如下:
更多参数:
参数 | 描述 |
---|---|
json | 字典,传入json数据,将自动进行序列化,支持get/post,请求体传递 |
files | 字典,传入文件对象,支持post |
auth | 认证,传入HTTPDigestAuth对象,一般场景是路由器弹出的两个输入框,爬虫获取不到,将用户名和密码输入后会base64加密然后放入请求头中进行交给服务端,base64("名字:密码"),请求头名字:authorization |
timeout | 超时时间,传入float/int/tuple类型。如果传入的是tuple,则是 (链接超时、返回超时) |
allow_redirects | 是否允许重定向,传入bool值 |
proxies | 开启代理,传入一个字典 |
stream | 是否返回文件流,传入bool值 |
cert | 证书地址,这玩意儿来自于HTTPS请求,需要传入该网站的认证证书地址,通常来讲如果是大公司的网站不会要求这玩意儿 |
如果爬取一个网站,该网站可能会返回给你一些cookies
,对这个网站后续的请求每次都要带上这些cookies
比较麻烦。
所以可以直接使用session
对象(自动保存cookies
)发送请求,它会携带当前对象中所有的cookies
。
以下是response
对象的所有参数:
response.request.headers 响应对应的请求头
参数 | 描述 |
---|---|
response.text | 返回文本响应内容 |
response.content | 返回二进制响应内容 |
response.json | 如果返回内容是json格式,则进行序列化 |
response.encoding | 返回响应内容的编码格式 |
response.status_code | 状态码 |
response.headers | 返回头/响应头 |
response.cookies | 返回的cookies对象 |
response.cookies.get_dict() | 以字典形式展示返回的cookies对象 |
response.cookies.items() | 以元组形式展示返回的cookies对象 |
response.url | 返回的url地址 |
response.history | 这是一个列表,如果请求被重定向,则将上一次被重定向的response对象添加到该列表中 |
编码问题
并非所有网页都是utf8
编码,有的网页是gbk
编码。
此时如果使用txt
查看响应内容就要指定编码格式:
下载文件
使用response.context
时,会将所有内容存放至内存中。
如果访问的资源是一个大文件,而需要对其进行下载时,可使用如下方式生成迭代器下载:
json返回内容
如果确定返回内容是json
数据,则可以通过response.json
进行查看:
加载文档:
符号 | 描述 |
---|---|
/ | 从根节点开始选取 |
// | 不考虑层级关系的选取节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 属性检测 |
[num] | 选取第n个标签元素,从1开始 |
/@attrName | 选取当前元素的某一属性 |
* | 通配符 |
/text() | 选取当前节点下的直系文本内容 |
//text() | 选取当前文本下的所有文本内容 |
| | 返回符号两侧所匹配的全部标签 |
注意:xPath选择完成后,返回的始终是一个list,与jQuery类似,可以通过Index取出Element对象
from lxml import etree
root = etree.parse("./testDataDocument.html",etree.HTMLParser())
# 从根节点开始找 /
form_list = root.xpath("/html/body/form")
print(form_list) # [<Element form at 0x203bd29c188>]
# 不考虑层级关系的选择节点 //
input_list = root.xpath("//input")
print(input_list)
# 从当前的节点开始选择 即第一个form表单 ./
select_list = form_list[0].xpath("./fieldset/select")
print(select_list)
# 选择当前节点的父节点 ..
form_parent_list = form_list[0].xpath("..")
print(form_parent_list) # [<Element body at 0x1c946e4c548>]
# 属性检测
@ 选取具有name属性的input框
input_username_list = root.xpath("//input[@name='username']")
print(input_username_list) # 属性选取
@ 获取元素的属性 attrs_list = root.xpath("//p/@title")
print(attrs_list)
# 选取第n个元素,从1开始
p_text_list = root.xpath("//p[2]/text()")
print(p_text_list)
# 通配符 * 选取所有带有属性的标签
have_attrs_ele_list = root.xpath("//*[@*]")
print(have_attrs_ele_list)
# 获取文本内容-直系
print(root.xpath("//form/text()"))
# 结果:一堆\r\n
# 获取文本内容-非直系
print(root.xpath("//form//text()"))
# 结果:本身和后代的text
# 返回所有input与p标签
ele_list = root.xpath("//input|//p")
print(ele_list)