基础知识
爬虫基本原理
![](https://i-blog.csdnimg.cn/blog_migrate/bec645cfd167e8c198fd0f0549396941.png)
1、发起请求
使用http库向目标站点发起请求,即发送一个Request
Request中包含哪些内容?
(1)请求方式
主要是GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等。
(2)请求URL
URL全称是统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL来唯一来确定
(3)请求头
包含请求时的头部信息,如User-Agent、Host、Cookies等信息
(4)请求体
请求时额外携带的数据,如表单提交时的表单数据
2、获取响应内容
如果服务器能正常响应,则会得到一个Response
Response中包含哪些内容?
(1)响应状态
有多种响应状态,如200代表成功,301代表跳转,404代表找不到页面,502代表服务器错误等
(2)响应头
如内容类型、内容长度、服务器信息、设置cookies等等
(3)响应体
最主要的部分,包含了请求资源的内容,如网页HTML、图片二进制数据等。
3、解析内容
解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以b的方式写入文件
4、保存数据
文本、二进制文件、数据库等
Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)
Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)
ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
Requests的基本使用
Requests 是一个功能强大、简单易用的 HTTP 请求库,可以使用 pip install requests
命令进行安装。
get方法
该方法用于向目标网址发送请求,接收响应
该方法的参数说明如下:
参数 | 说明 |
---|---|
url | 必填,指定请求 URL |
params | 字典类型,指定请求参数,常用于发送 GET 请求时使用 |
data | 字典类型,指定表单信息,常用于发送 POST 请求时使用 (此时应该使用 post 方法,只需要简单的将 get 替换成 post 即可) |
headers | 字典类型,指定请求头部 |
proxies | 字典类型,指定使用的代理 |
cookies | 字典类型,指定 Cookie |
auth | 元组类型,指定登陆时的账号和密码 |
verify | 布尔类型,指定请求网站时是否需要进行证书验证,默认为 True,表示需要证书验证 |
timeout | 指定超时时间,若超过指定时间没有获得响应,则抛出异常 |
该方法返回一个 Response 对象,其常用的属性和方法列举如下:
属性方法 | 说明 |
---|---|
response.url | 返回请求网站的 URL |
response.status_code | 返回响应的状态码 |
response.encoding | 返回响应的编码方式 |
response.cookies | 返回响应的 Cookie 信息 |
response.headers | 返回响应头 |
response.content | 返回 bytes 类型的响应体 |
response.text | 返回 str 类型的响应体,相当于 response.content.decode(‘utf-8’) |
response.json() | 返回 dict 类型的响应体,相当于 json.loads(response.text) |
XPath
作用:解析XML(HTML)
对于网页解析来说,xpath比re更加方便简洁,故 Python 中也提供相应的模块 —— lxml.etree,我们可以使用 pip install lxml
命令进行安装。
XML 文档中常见的节点包括:
根节点 | html |
元素节点 | html、body、div、p、a |
属性节点 | href |
文本节点 | Hello world、Click here |
XML 文档中常见的节点间关系包括:
父子: 例如,<p> 和 <a> 是 <div> 的子节点,反之,也称 <div> 是 <p> 和 <a> 的父节点
兄弟: 例如,<p> 和 <a> 称为兄弟节点
祖先/后代:例如,<body>、<div>、<p>、<a> 都是 <html> 的后代节点,反之,也称 <html> 是 <body>、<div>、<p>、<a> 的祖先节点
匹配语法:
/ | 子代节点 |
// | 后代节点 |
* | 所有节点 |
text() | 文本节点 |
@ATTR | 属性节点 |
谓语 :用于匹配指定的标签
1.指定第二个 <a> 标签
test = html.xpath('//a[2]')
2.指定前两个 <a> 标签
test = html.xpath('//a[position()<=2]')
3.指定带有 href 属性的 <a> 标签
test = html.xpath('//a[@href]')
4.指定带有 href 属性且值为 image1.html 的 <a> 标签
test = html.xpath('//a[@href="image1.html"]')
5.指定带有 href 属性且值包含 image 的 <a> 标签
test = html.xpath('//a[contains(@href,"image")]')
_Element 对象:
xpath 方法返回字符串或者匹配列表,匹配列表中的每一项都是 lxml.etree._Element 对象
tag | 返回标签名 |
attrib | 返回属性与值组成的字典 |
get() | 返回指定属性的值 |
text | 返回文本值 |
网页分析
for i in range ()
range(start, stop[, step])
,分别是起始、终止和步长
for i in range(3):
print(i)
0
1
2
for i in range(1,3):
print(i)
1
2
多进程
【python】详解multiprocessing多进程-Pool进程池模块
multiprocessing多进程-Pool进程池模块
Multiprocessing.Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行它。Pool类用于需要执行的目标很多,而手动限制进程数量又太繁琐时,如果目标少且不用控制进程数量则可以用Process类。
class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])
processes | 是要使用的工作进程数。如果进程是None,那么使用返回的数字os.cpu_count()。也就是说根据本地的cpu个数决定,processes小于等于本地的cpu个数 |
initializer | 如果initializer是None,那么每一个工作进程在开始的时候会调用initializer(*initargs)。 |
maxtasksperchild | 工作进程退出之前可以完成的任务数,完成后用一个新的工作进程来替代原进程,来让闲置的资源被释放。maxtasksperchild默认是None,意味着只要Pool存在工作进程就会一直存活。 |
context | 用在制定工作进程启动时的上下文,一般使用 multiprocessing.Pool() 或者一个context对象的Pool()方法来创建一个池,两种方法都适当的设置了context。 |