Python学习之用Requests和XPath多进程爬取有道单词数据

本文介绍了使用Python的Requests库和XPath解析技术进行网络爬虫的基础知识,包括get方法、XPath解析网页、多进程爬取以及如何使用SQLite存储数据。在多进程部分,讲解了multiprocessing的Pool进程池模块,以及如何处理结果。最后,由于多进程和SQLite同步问题,选择了先爬取数据到txt文件,再导入SQLite数据库。
摘要由CSDN通过智能技术生成

基础知识

爬虫基本原理

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。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用Pythonrequestsxpath和正则表达式爬取豆瓣电影top250详情页的代码: ```python import requests from lxml import etree import re def get_movie_details(url): # 发送请求获取页面内容 response = requests.get(url) html = response.content.decode('utf-8') # 解析页面内容 selector = etree.HTML(html) # 获取电影名称 movie_name = selector.xpath('//h1/span/text()')[0] # 获取导演和主演信息 director_and_cast = selector.xpath('//div[@id="info"]/span[1]/span[@class="attrs"]/a/text()') director = director_and_cast[0] cast = director_and_cast[1:] # 获取上映年份、地区、类型 year_country_type = selector.xpath('//div[@id="info"]/text()') year = re.findall('\d{4}', year_country_type[1])[0] country = year_country_type[2].strip().split('/')[0] type = year_country_type[2].strip().split('/')[-1] # 获取评分和评价人数 rating = selector.xpath('//strong[@class="ll rating_num"]/text()')[0] rating_num = selector.xpath('//div[@class="rating_sum"]/a/span/text()')[0] # 获取电影简介 summary = selector.xpath('//div[@class="indent"]/span[@class="all hidden"]/text()')[0] # 构造电影信息字典 movie_info = { '名称': movie_name, '导演': director, '主演': cast, '年份': year, '地区': country, '类型': type, '评分': rating, '评价人数': rating_num, '简介': summary.strip(), } return movie_info if __name__ == '__main__': urls = ['https://movie.douban.com/top250?start={}'.format(i) for i in range(0, 250, 25)] for url in urls: response = requests.get(url) html = response.content.decode('utf-8') selector = etree.HTML(html) # 获取电影详情页链接 movie_links = selector.xpath('//div[@class="hd"]/a/@href') for link in movie_links: movie_info = get_movie_details(link) print(movie_info) ``` 这段代码会爬取豆瓣电影top250列表页面中每部电影的详情页,并从详情页中提取电影名称、导演和主演、上映年份、地区、类型、评分、评价人数、电影简介等信息,并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值