数据抓取-bs4、XPath、pyquery详细代码演示

2023-11-10 06:10

本文主要是介绍数据抓取-bs4、XPath、pyquery详细代码演示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据抓取-bs4、XPath、pyquery

一般抓取某个网站或者某个应用的内容,内容分为两个部分

  • 非结构化的文本:HTML文本

  • 结构化的文本:JSON、XML

非结构化的数据常见的解析方式有:XPath、CSS选择器、正则表达式

XPath语言

XPath是XML路径语言,他是一种用来定位XML文档中的某部分位置的语言

将HTML转换成XML文档之后,用XPath查找HTML节点或元素

比如用"来作为上下层级间的分隔,第一个"/"表示文档的根节点(注意,不是指文档最外层的tag节点,而是指文档本身)。

比如对于一个HTML文件来说,最外层的节点应该是"/html"。

XPath语法

Xpath是一门在XML文档中查找信息的语言。

XPath 可用来在XML文档中对元素和属性进行遍历。

选取节点 XPath使用路径表达式在XML文档中选取节点。节点是通过沿着路径或者step来选取的。

下面列出了最有用的路径表达式:

在这里插入图片描述

在下面列举出一些路径表达式以及表达式结果

在这里插入图片描述

安装XPath库

首先在终端中pip install lxml ,然后对XPath库进行import

from lxml import html  # XPath包

代码演示

我们对下面这个网站进行爬取

https://www.fabiaoqing.com/

首先要构建一个模板

import requestsurl = ''
headers = {}
response = requests.get(url,headers=headers).text

下面我们需要得到里面一张图片的地址,通过F12来定位图片所在路径

在这里插入图片描述

打开源代码,搜索上面那个网页路径,如果在源代码中包含的话,说明这张图片是静态数据,得到这张图片的地址,放入代码url

之后我们来寻找headers,通过F12来获取,放入代码headers

在这里插入图片描述

由于是图片返回的内容,所以我们将text换成content

之后导入os库来显示图片的保存

import requests
import os
#路径保存
path = './images/'
count = 1url = 'http://tva3.sinaimg.cn/large/006D3Lhmgy1h4eqp9hggjj30go0gwq3l.jpg'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers).contentif not os.path.exists(path):os.makedirs(path)
with open(path + "{}.jpg".format(count),'ab') as f:f.write(response)

就可以将爬的图片存到文件夹中

在这里插入图片描述

以上就是完成一张 图片爬取的过程


下面我们对代码进行封装:文件储存和文件请求

  • 文件请求
def Tools(url):'''请求工具函数:param url:请求地址:return:响应状态'''# url = 'http://tva3.sinaimg.cn/large/006wuNILly1h3zb9wkxf7j30jg0jgq4l.jpg'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}# response = requests.get(url, headers=headers).contentresponse = requests.get(url, headers=headers)return response
  • 文件存储
def Save(img_url):'''存储图片:param img_url: 图片地址:return: None'''count = 1response = Tools(img_url).contentif not os.path.exists(path):os.makedirs(path)with open(path + "{}.jpg".format(count), 'ab') as f:f.write(response)

导入lxml库之后,我们需要对response转成xml的格式,由于原来的response格式是string类型

url = 'https://www.fabiaoqing.com/biaoqing/detail/id/681814.html'
response = Tools(url).text # 静态页面内容
print(type(response))
#------运行结果----------
<class 'str'>

我们创建一个xml的对象来转换格式

xml1 = html.etree.HTML(response)
print(type(xml1))
# ------运行结果-------
<class 'lxml.etree._Element'>#------------------------------
# 创建一个lxml对象
xml1 = html.etree.HTML(response)
img_url = xml1.xpath() #使用相对路径

XPath也分为相对路径和绝对路径

xpath缺点:如果查询路径下面存在其他内容,就会返回元素得内存地址,需要遍历

xml1 = html.etree.HTML(response)
print(xml1)
# ------运行结果----------
<Element html at 0x17197980ac0>
img_url = xml1.xpath('//img[@class="biaoqingpp"]/@src') [0] # xpath缺点:如果查询路径下面存在其他内容,就会返回元素得内存地址,需要遍历
print(img_url)
# ---------运行结果-----------
http://tva3.sinaimg.cn/large/006wuNILly1h3zb9wkxf7j30jg0jgq4l.jpg

我们现在想要得到一系列得图片地址,所以我们将url替换

这里我们使用pyquery库

pyquery库安装

pip install pyquery
from pyquery import PyQuery as pq  # 简单快捷

  • 在寻找数据标签提取的时候,但是没有可选属性(calss id)找上级 属性是否存在,一般是带有属性的标签才是可选的

当存在class拥有多个属性的时候,xpath可以

xpath:[@class="swiper-slide swiper-slide-active bqpp"] 多个属性

而pyquery更侧重于选择器为主

url = 'https://www.fabiaoqing.com/bqb/detail/id/54891.html'
response = Tools(url).text
doc = pq(response) # 创建一个pyquery对象
# id选择器 #
# class选择器 .
# 如果存在多个 空格换成对于的选择器方式
# 想要选择下级的内容 用空格分割
detail =doc('.swiper-slide.swiper-slide-active.bqpp a')
print(detail)
# ------------------运行结果----------------------
<a href="/biaoqing/detail/id/681278.html" title="&#x65E9;&#x4E0A;&#x597D;,&#x6211;&#x7684;&#x5DE5;&#x53CB;"/><a href="/biaoqing/detail/id/681279.html" title="&#x5982;&#x679C;&#x7231;&#x8BF7;&#x6253;&#x94B1;"/><a href="/biaoqing/detail/id/681280.html" title="&#x5475;&#x5475;&#x6813;Q"/><a href="/biaoqing/detail/id/681281.html" title="&#x731B;&#x72D7;&#x54ED;&#x6CE3;"/>
<a href="/biaoqing/detail/id/681282.html" title="&#x6491;&#x4F1E;??&#x6211;&#x8BA9;&#x4F60;&#x6491;&#x4F1E;!"/>
<a href="/biaoqing/detail/id/681283.html" title="&#x8DEA;&#x4E0B;&#x4E3E;&#x624B;&#x4E0D;&#x6740;"/>
<a href="/biaoqing/detail/id/681284.html" title="&#x8D77;&#x4E0D;&#x6765;&#x5E8A;"/>
<a href="/biaoqing/detail/id/681285.html" title="&#x600E;&#x4E48;&#x4E86;?&#x4E0D;&#x56DE;&#x4F60;&#x6D88;&#x606F;&#x591A;&#x6B63;&#x5E38;&#x554A;&#x4F60;&#x770B;&#x54EA;&#x4E2A;&#x7F8E;&#x5973;&#x4E0D;&#x5FD9;&#x7684;"/>
<a href="/biaoqing/detail/id/681286.html" title="&#x8001;&#x5B50;&#x6234;&#x4E2A;&#x8001;&#x82B1;&#x955C;&#x90FD;&#x770B;&#x4E0D;&#x6E05;&#x4F60;&#x4E2A;&#x827E;&#x65AF;&#x81C2;"/>
<a href="/biaoqing/detail/id/681287.html" title="&#x90A3;&#x4F60;&#x62A5;&#x8B66;&#x561B;"/>
<a href="/biaoqing/detail/id/681288.html" title="&#x629B;&#x5F00;&#x5185;&#x5BB9;&#x4E0D;&#x8C08;&#x4F60;&#x8BF4;&#x7684;&#x5F88;&#x6709;&#x9053;&#x7406;"/>
<a href="/biaoqing/detail/id/681289.html" title="&#x4E0D;&#x77E5;&#x9053;&#x4E3A;&#x4EC0;&#x4E48;&#x5C31;&#x662F;&#x4E0D;&#x60F3;&#x5E72;&#x4E86;"/>
<a href="/biaoqing/detail/id/681290.html" title="&#x6211;&#x6CA1;&#x60F9;&#x4F60;&#x4EEC;&#x4EFB;&#x4F55;&#x4EBA;&#x57AE;&#x5C0F;&#x8138;"/>

变为元素地址

detail =[i for i in doc('.swiper-slide.swiper-slide-active.bqpp a')]  # 变为元素地址
print(detail)
# ------------------运行结果----------------------
[<Element a at 0x1e52f54b770>, <Element a at 0x1e52f54b270>, <Element a at 0x1e52f54b360>, <Element a at 0x1e52f54b130>, <Element a at 0x1e52f54b180>, <Element a at 0x1e52f54b4a0>, <Element a at 0x1e52f54b400>, <Element a at 0x1e52f54b0e0>, <Element a at 0x1e52f54b090>, <Element a at 0x1e52f54b7c0>, <Element a at 0x1e52f54b680>, <Element a at 0x1e52f54b810>, <Element a at 0x1e52f54b860>]

返回查询对象

detail =doc('.swiper-slide.swiper-slide-active.bqpp a').items() # 返回查询对象
for i in detail :print(i)
# ------------------运行结果----------------------
<a href="/biaoqing/detail/id/681278.html" title="&#x65E9;&#x4E0A;&#x597D;,&#x6211;&#x7684;&#x5DE5;&#x53CB;"/><a href="/biaoqing/detail/id/681279.html" title="&#x5982;&#x679C;&#x7231;&#x8BF7;&#x6253;&#x94B1;"/><a href="/biaoqing/detail/id/681280.html" title="&#x5475;&#x5475;&#x6813;Q"/><a href="/biaoqing/detail/id/681281.html" title="&#x731B;&#x72D7;&#x54ED;&#x6CE3;"/><a href="/biaoqing/detail/id/681282.html" title="&#x6491;&#x4F1E;??&#x6211;&#x8BA9;&#x4F60;&#x6491;&#x4F1E;!"/><a href="/biaoqing/detail/id/681283.html" title="&#x8DEA;&#x4E0B;&#x4E3E;&#x624B;&#x4E0D;&#x6740;"/><a href="/biaoqing/detail/id/681284.html" title="&#x8D77;&#x4E0D;&#x6765;&#x5E8A;"/><a href="/biaoqing/detail/id/681285.html" title="&#x600E;&#x4E48;&#x4E86;?&#x4E0D;&#x56DE;&#x4F60;&#x6D88;&#x606F;&#x591A;&#x6B63;&#x5E38;&#x554A;&#x4F60;&#x770B;&#x54EA;&#x4E2A;&#x7F8E;&#x5973;&#x4E0D;&#x5FD9;&#x7684;"/><a href="/biaoqing/detail/id/681286.html" title="&#x8001;&#x5B50;&#x6234;&#x4E2A;&#x8001;&#x82B1;&#x955C;&#x90FD;&#x770B;&#x4E0D;&#x6E05;&#x4F60;&#x4E2A;&#x827E;&#x65AF;&#x81C2;"/><a href="/biaoqing/detail/id/681287.html" title="&#x90A3;&#x4F60;&#x62A5;&#x8B66;&#x561B;"/><a href="/biaoqing/detail/id/681288.html" title="&#x629B;&#x5F00;&#x5185;&#x5BB9;&#x4E0D;&#x8C08;&#x4F60;&#x8BF4;&#x7684;&#x5F88;&#x6709;&#x9053;&#x7406;"/><a href="/biaoqing/detail/id/681289.html" title="&#x4E0D;&#x77E5;&#x9053;&#x4E3A;&#x4EC0;&#x4E48;&#x5C31;&#x662F;&#x4E0D;&#x60F3;&#x5E72;&#x4E86;"/><a href="/biaoqing/detail/id/681290.html" title="&#x6211;&#x6CA1;&#x60F9;&#x4F60;&#x4EEC;&#x4EFB;&#x4F55;&#x4EBA;&#x57AE;&#x5C0F;&#x8138;"/>

接着我们取出href标签

完整代码如下:就可以爬取二级页面内的图片放入文件夹

import requests
import os
from lxml import html  # XPath包 定位精准
from pyquery import PyQuery as pq  # 简单快捷 选择器为主def Tools(url):'''请求工具函数:param url:请求地址:return:响应状态'''# url = 'http://tva3.sinaimg.cn/large/006wuNILly1h3zb9wkxf7j30jg0jgq4l.jpg'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}# response = requests.get(url, headers=headers).contentresponse = requests.get(url, headers=headers)return response# 全局变量
path = './images/'
count = 1def Save(img_url):"""存储图片:param img_url: 图片地址:return: None"""global countresponse = Tools(img_url).content# 判断path是否存在if not os.path.exists(path):os.makedirs(path)  # 如果不存在就创建 递归创建# with 写入方法 w:不存在就覆盖创建(文件) a: 追加模式with open(path + "{}.jpg".format(count), 'ab') as f:f.write(response)count += 1def Details(detail):"""xpath学习 提取 图片地址:param detail:详情页后缀:return:None"""url = 'https://www.fabiaoqing.com{}'.format(detail)response = Tools(url).text# 创建一个lxml对象xml1 = html.etree.HTML(response)# xpath:[@class="swiper-slide swiper-slide-active bqpp"] 多个属性# 从哪里开始,例如(//img)[@选择一个属性] id/class 都是属性  / 下级  包含里面也是下级img_url = xml1.xpath('//img[@class="biaoqingpp"]/@src')[0]Save(img_url)def Bqp():"""二级页面 主要是获取详情页后缀:return:None"""url = 'https://www.fabiaoqing.com/bqb/detail/id/54891.html'response = Tools(url).textdoc = pq(response)  # 创建一个pyquery对象# id选择器 ## class选择器 .# 如果存在多个 空格换成对于的选择器方式# 想要选择下级的内容 用空格分割# detail = [i for i in doc('.swiper-slide.swiper-slide-active.bqpp a')]  # 变为元素地址# print(detail)detail = doc('.swiper-slide.swiper-slide-active.bqpp a').items()  # 返回查询对象for i in detail:href = i.attr('href')  # attr 属性的获取Details(href)Bqp()

保存的图片都存放在image文件夹中

在这里插入图片描述


bs4应用和Beautiful Soup

  • 安装
pip install bs4
from bs4 import BeautifulSoup

现在我们需要在一级页面内爬取二级页面的内容

BeautifulSoup 就是 Python 的一个 HTML 或 XML 的解析库。

  • 提供了一些简单的方法。编写应用程序所需的代码不多

  • 自动将传入的文档转换为Unicode,将传出的文档转换为UTF-8。然后,您只需指定原始的编码

  • 位于流行的Python解析器之上,比如lxml和html5lib。

具体beautifulsoup库的知识可以看一下下面的网址

https://aistudio.csdn.net/62e38a76cd38997446774c98.html?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromBaidu~activity-1-81171951-blog-100668663.pc_relevant_vip_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~BlogCommendFromBaidu~activity-1-81171951-blog-100668663.pc_relevant_vip_default&utm_relevant_index=1

使用了这个工具可以进行解析,直接找到元素内容

在这里插入图片描述

def Twelve():url = 'https://www.fabiaoqing.com/bqb/lists/type/doutu.html'response = Tools(url).textsoup = BeautifulSoup(response,'lxml') # 解析对象items = soup.find('div',{'class':'ui segment'}).find_all('div',{'class':'bqppdiv'})print(items)Twelve()
# ------------------运行结果----------------------
[<div class="bqppdiv" style="vertical-align:middle;">
<img alt="FUCK,艹 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情-发表情" class="ui image lazy" data-original="http://tva3.sinaimg.cn/bmiddle/415f82b9ly1faxk6dg7ddj20ku0i71kx0.jpg" src="/Public/lazyload/img/transparent.gif" style="max-height: 170;max-width: 100%;margin: 0 auto"/> <p style="display: block;height: 0;width: 0;overflow: hidden;">FUCK,艹 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情</p>
</div>, <div class="bqppdiv" style="vertical-align:middle;">
<img alt="再装逼怼死你 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情-发表情" class="ui image lazy" data-original="http://tva3.sinaimg.cn/bmiddle/415f82b9ly1faxk70o0jyj20ku0i71kx0.jpg" src="/Public/lazyload/img/transparent.gif" style="max-height: 170;max-width: 100%;margin: 0 auto"/> <p style="display: block;height: 0;width: 0;overflow: hidden;">再装逼怼死你 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情</p>
</div>, <div class="bqppdiv" style="vertical-align:middle;">
<img alt="火冒三藏(火冒三丈) - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情-发表情" class="ui image lazy" data-original="http://tva3.sinaimg.cn/bmiddle/415f82b9ly1faxk7cip2oj20dw0dwwg30.jpg" src="/Public/lazyload/img/transparent.gif" style="max-height: 170;max-width: 100%;margin: 0 auto"/> <p style="display: block;height: 0;width: 0;overflow: hidden;">火冒三藏(火冒三丈) - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情</p>
</div>, <div class="bqppdiv" style="vertical-align:middle;">
<img alt="是为师错怪你了,但那又如何 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情-发表情" class="ui image lazy" data-original="http://tva3.sinaimg.cn/bmiddle/415f82b9ly1faxmjfcr3xj20ku0i71kx0.jpg" src="/Public/lazyload/img/transparent.gif" style="max-height: 170;max-width: 100%;margin: 0 auto"/> <p style="display: block;height: 0;width: 0;overflow: hidden;">是为师错怪你了,但那又如何 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情</p>
</div>, <div class="bqppdiv notshowinpc" style="vertical-align:middle;">
<img alt="我 TMD 没说过这句话 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情-发表情" class="ui image lazy" data-original="http://tva3.sinaimg.cn/bmiddle/415f82b9ly1faxmjesozvj20ku0i71kx0.jpg" src="/Public/lazyload/img/transparent.gif" style="max-height: 170;max-width: 100%;margin: 0 auto"/> <p style="display: block;height: 0;width: 0;overflow: hidden;">我 TMD 没说过这句话 - 唐僧系列表情包:你们再给贫僧瞎配字,老子喷掉你妈的远古巨坟_唐僧_妈卖批_装逼_斗图表情</p>
</div>]

如果我们想要得到里面的属性

在这里插入图片描述

items = soup.find('a',{'class':'bqba'}).get('href')
print(items)
# --------------运行结果-------------------
/bqb/detail/id/9825.html

想要批量得到数据就要对代码进行修改,得到后缀地址

items = soup.find_all('a',{'class':'bqba'})for i in items:print(i.get('href'))# --------------运行结果-------------------
/bqb/detail/id/9825.html
/bqb/detail/id/20585.html
/bqb/detail/id/30834.html
/bqb/detail/id/30739.html
/bqb/detail/id/51396.html
/bqb/detail/id/51206.html
/bqb/detail/id/51449.html
/bqb/detail/id/51355.html
/bqb/detail/id/51431.html
/bqb/detail/id/39818.html

下面展示爬取页面的完整代码

import requests
import os
from lxml import html  # XPath包 定位精准
from pyquery import PyQuery as pq  # 简单快捷 选择器为主
from bs4 import BeautifulSoupdef Tools(url):'''请求工具函数:param url:请求地址:return:响应状态'''# url = 'http://tva3.sinaimg.cn/large/006wuNILly1h3zb9wkxf7j30jg0jgq4l.jpg'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}# response = requests.get(url, headers=headers).contentresponse = requests.get(url, headers=headers)return response# 全局变量
path = './images/'
count = 1def Save(img_url):"""存储图片:param img_url: 图片地址:return: None"""global countresponse = Tools(img_url).content# 判断path是否存在if not os.path.exists(path):os.makedirs(path)  # 如果不存在就创建 递归创建# with 写入方法 w:不存在就覆盖创建(文件) a: 追加模式with open(path + "{}.jpg".format(count), 'ab') as f:f.write(response)count += 1def Details(detail):"""xpath学习 提取 图片地址:param detail:详情页后缀:return:None"""url = 'https://www.fabiaoqing.com{}'.format(detail)response = Tools(url).text# 创建一个lxml对象xml1 = html.etree.HTML(response)# xpath:[@class="swiper-slide swiper-slide-active bqpp"] 多个属性# 从哪里开始,例如(//img)[@选择一个属性] id/class 都是属性  / 下级  包含里面也是下级img_url = xml1.xpath('//img[@class="biaoqingpp"]/@src')[0]print('img:', img_url)Save(img_url)def Bqp(id1):"""二级页面 主要是获取详情页后缀:return:None"""url = 'https://www.fabiaoqing.com{}'.format(id1)response = Tools(url).textdoc = pq(response)  # 创建一个pyquery对象# id选择器 ## class选择器 .# 如果存在多个 空格换成对于的选择器方式# 想要选择下级的内容 用空格分割# detail = [i for i in doc('.swiper-slide.swiper-slide-active.bqpp a')]  # 变为元素地址# print(detail)detail = doc('.swiper-slide.swiper-slide-active.bqpp a').items()  # 返回查询对象for i in detail:href = i.attr('href')  # attr 属性的获取Details(href)def Twelve():url = 'https://www.fabiaoqing.com/bqb/lists/type/doutu.html'response = Tools(url).textsoup = BeautifulSoup(response,'lxml') # 解析对象# items = soup.find('div',{'class':'ui segment'}).find_all('div',{'class':'bqppdiv'})items = soup.find_all('a',{'class':'bqba'})for i in items:pid1 = i.get('href')Bqp(pid1)# print(items)
Twelve()# ---------------运行结果-------------------------
img: http://tva3.sinaimg.cn/large/415f82b9ly1faxk6dg7ddj20ku0i71kx0.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1faxk70o0jyj20ku0i71kx0.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1faxk7cip2oj20dw0dwwg30.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1faxmjfcr3xj20ku0i71kx0.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1faxmjesozvj20ku0i71kx0.jpg
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5axr3aqg205k05k76n.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5ay4tw8g205k05kmzi.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5aykcxig205k05kgnz.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5ayu2tcg205k05k0v3.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5az9400g205k05k0v3.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5azk1dpg205k05ktb2.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5azuzebg205k05kwgu.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5b099i7g205k05kacg.gif
img: http://tva3.sinaimg.cn/large/cf652d2bgy1fet5b0lfoug205k05kq5a.gif
img: http://tva3.sinaimg.cn/large/a9cf8ef6ly1fiecn56l8wj20b50b2glu.jpg
img: http://tva3.sinaimg.cn/large/a9cf8ef6ly1fiecn5kfa1j20b50b274n.jpg
img: http://tva3.sinaimg.cn/large/a9cf8ef6ly1fiecn5to8ej20b50b2aad.jpg
img: http://tva3.sinaimg.cn/large/a9cf8ef6ly1fiecn62tbbj20b50b2jrs.jpg
img: http://tva3.sinaimg.cn/large/a9cf8ef6ly1fiecn6dfkij20b50b2wes.jpg
img: http://tva3.sinaimg.cn/large/a9cf8ef6ly1fiecn6plqvj20b50b2t9l.jpg
img: http://tva3.sinaimg.cn/large/a9cf8ef6ly1fiecn4v8maj20b50b2jro.jpg
img: http://tva3.sinaimg.cn/large/006fbYi5gy1fid8qw20afj308c06s74c.jpg
img: http://tva3.sinaimg.cn/large/006fbYi5gy1fid8qw8wtxj304z04oa9z.jpg
img: http://tva3.sinaimg.cn/large/006fbYi5gy1fid8qwjf87j30hs0ef74x.jpg
img: http://tva3.sinaimg.cn/large/006fbYi5gy1fid8qvux8mj305i04vdfs.jpg
img: http://tva3.sinaimg.cn/large/006fbYi5gy1fid8qwt2b5j303302bmx0.jpg
img: http://tva3.sinaimg.cn/large/006fbYi5gy1fid8qwzj5qj303302b3yb.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmsggpt4nj30k00hotai.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmqhprkcqj30u00u0wgb.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmt7u5issj302o02qmx7.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmsvkpnxjj30at0ay757.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmqhqfaruj30dw0iqgno.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmr7l0r74j305i058wf4.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmsg31068j3048048dgc.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmraxkj4oj304g03u0ss.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxmr7kt7uij308k0afwf6.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwqhawt334j30k00n0485.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwq1v50u6jj30k00k0ac4.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwqj2l6gwcj30ik0m70ug.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwqg6p42p9j307i08iq3a.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwr345nafcj30j60hwtgw.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwq1wu0fgmj30fd0fdgm6.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwqfkdkpyqj30hs0hst9j.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fwq1v4f8t2j30c80bzjrt.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtf8kfkerj30j60kedh8.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtbp3utemj30go0go74x.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtoo6bha3j30v91by7l6.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtrcwlb3mj302t03ct8u.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtdenusy1j30go0dudjy.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtf84o9y6j30j60hwtcn.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtf84twtbj30c20c0my8.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtp35bi77j315o15o4qp.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxtpnqqrsxj30u00u0gsq.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxgphl6w5oj30v80n4adz.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxh2npx2bwj307i07j751.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxh17465kfj307i07imyf.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxgphklbw4j30hs0dsgmn.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxgphwjmp1j30go0go0u5.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxgyyyuaz4j30jg0fota8.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxh1p1ewbuj306o06ojsa.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxgyyyph5rj30qo0qon4b.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxriyq4uohj30hz0hzn8f.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxrftk0gu9j302e01xdfu.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxrhbgm8xqj30hg0gzgnl.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxrfis81f2j30ti0ti78c.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxpwoybmlmj305i05cdg3.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxri0qt2ddj30k00sfadq.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxrjmjo6u1j30qo0q9jsl.jpg
img: http://tva3.sinaimg.cn/large/006m97Kgly1fxq9fbvdb3j31500u0whw.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn08nfh2j20ii0hsq3v.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn0a3ko7j20hs0hsjsa.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn06yjoej20hs0gygn0.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn08g4pxj20go0gcjsy.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn06lxbpj20ku0l6whm.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn0binx2j20kt0kqaby.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn07ibb3j20hs0hs3zt.jpg
img: http://tva3.sinaimg.cn/large/415f82b9ly1flhn0u67qyj20re0qogns.jpg

静态页面中不同页数的爬取

在静态页面中不同页面的区别只是换了不同的html,例如下面是第一页和第二页

在这里插入图片描述

我们对代码进行修改来爬取整个页面的图片

import requests
import os
from lxml import html  # XPath包 定位精准
from pyquery import PyQuery as pq  # 简单快捷 选择器为主
from bs4 import BeautifulSoupdef Tools(url):'''请求工具函数:param url:请求地址:return:响应状态'''# url = 'http://tva3.sinaimg.cn/large/006wuNILly1h3zb9wkxf7j30jg0jgq4l.jpg'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'}# response = requests.get(url, headers=headers).contentresponse = requests.get(url, headers=headers)return response# 全局变量
path = './images/'
count = 1def Save(img_url):"""存储图片:param img_url: 图片地址:return: None"""global countresponse = Tools(img_url).content# 判断path是否存在if not os.path.exists(path):os.makedirs(path)  # 如果不存在就创建 递归创建# with 写入方法 w:不存在就覆盖创建(文件) a: 追加模式with open(path + "{}.gif".format(count), 'ab') as f:f.write(response)count += 1def Details(detail):"""xpath学习 提取 图片地址:param detail:详情页后缀:return:None"""url = 'https://www.fabiaoqing.com{}'.format(detail)response = Tools(url).text# 创建一个lxml对象xml1 = html.etree.HTML(response)# xpath:[@class="swiper-slide swiper-slide-active bqpp"] 多个属性# 从哪里开始,例如(//img)[@选择一个属性] id/class 都是属性  / 下级  包含里面也是下级img_url = xml1.xpath('//img[@class="biaoqingpp"]/@src')[0]print('img:', img_url)Save(img_url)def Bqp(id1):"""二级页面 主要是获取详情页后缀:return:None"""url = 'https://www.fabiaoqing.com{}'.format(id1)response = Tools(url).textdoc = pq(response)  # 创建一个pyquery对象# id选择器 ## class选择器 .# 如果存在多个 空格换成对于的选择器方式# 想要选择下级的内容 用空格分割# detail = [i for i in doc('.swiper-slide.swiper-slide-active.bqpp a')]  # 变为元素地址# print(detail)detail = doc('.swiper-slide.swiper-slide-active.bqpp a').items()  # 返回查询对象for i in detail:href = i.attr('href')  # attr 属性的获取Details(href)def Twelve(page, type1):"""首页请求获取二级页面数据:param page:分页:param type1:图片类型:return:None"""url = 'https://www.fabiaoqing.com/bqb/lists/type/{}/page/{}.html'.format(type1, page)response = Tools(url).textsoup = BeautifulSoup(response, 'lxml')  # 解析对象# items = soup.find('div',{'class':'ui segment'}).find_all('div',{'class':'bqppdiv'})items = soup.find_all('a', {'class': 'bqba'})for i in items:pid1 = i.get('href')Bqp(pid1)# print(items)def main():url = 'https://www.fabiaoqing.com/bqb/lists/type/doutu.html'response = Tools(url).text# 使用pyquerydoc = pq(response)item = doc('.ui.secondary.pointing.blue.menu a').items()for i, page in zip(item, range(1, 10)):href = i.attr('href').split('/')[4].split('.')[0]# print(href)Twelve(page,href)if __name__ == '__main__':main()

运行的结果就是爬取了500多张的图片

在这里插入图片描述

这篇关于数据抓取-bs4、XPath、pyquery详细代码演示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/380827

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X