爬虫
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)
浙公网安备 33010602011771号