爬虫网页解析之css用法及实战爬取中国校花网

用Python爬取中国校花网后,我发现她们都有个共同点! 我们都知道,爬虫获取页面的响应之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来, python从网页中提取数据的包很多,常用的解析模块有下面的几个: BeautifulSoup API简单 但解析速度慢,不推荐使用 lxml 由C语言编写的xml解析库(libxm2),解析速度快 但是API复杂 Scrapy 综合以上两者优势实现了自己的数据提取机制,被称为Selector... 阅读详情

前言

我们都知道,爬虫获取页面的响应之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来,

python从网页中提取数据的包很多,常用的解析模块有下面的几个:

  • BeautifulSoup API简单 但解析速度慢,不推荐使用

  • lxml 由C语言编写的xml解析库(libxm2),解析速度快 但是API复杂

  • Scrapy 综合以上两者优势实现了自己的数据提取机制,被称为Selector选择器。

它是由lxml库构建的,并简化了API ,先通过XPath或者CSS选择器选中要提取的数据,然后进行提取

Scrapy选择器构建于 lxml 库之上,这意味着它们在速度和解析准确性上非常相似。

Selector选择器的用法

下面我们以 Scrapy Shell 和 Scrapy 文档服务器的一个样例页面(url=http://doc.scrapy.org/en/latest/_static/selectors-sample1.html)
来了解选择器的基本用法:

构造选择器

Scrapy selector 可以以 文字(Text),二进制(content)或 TextResponse 构造的 Selector。其根据输入类型自动选择最优的分析方法
以文字构造:

url = "http://doc.scrapy.org/en/latest/_static/selectors-sample1.html"
response = requests.get(url=url)
selector = Selector(text=response.text)

以 response 构造:

selector = Selector(response=response)

以二进制构造:

selector = Selector(text=response.content)
使用选择器

这里强烈推荐使用 scrapy shell 来进行调试!

为什么要使用 scrapy shell ?

当我们需要爬取某个网站,然后提取数据的时候,要用到 xpath css 或者正则提取方法等

但是有时候这些xpath 或者css 语句不一定一次就能写对,有时候需要我们不断地去调试。

可能有些人会说,我每写一次然后重新去请求,输出结果测试一下就知道了。只能说这种做法就比较愚蠢了,如果遇到那种容易封IP的网站,你这样频繁的去请求测试,测不了几次,你的ip就被封了

这时候,我们要使用 scrapy shell 去调试,测试成功后,在拷贝到我们的项目中就可以了

如何使用 scrapy shell?

首先打开 Shell, 然后输入命令 scrapy shell url

scrapy shell http://doc.scrapy.org/en/latest/_static/selectors-sample1.html

scrapy shell

当然在 pycharm中, 也可以使用

scrapy shell

当 shell 载入后,将获得名为 response 的 shell 变量,url 响应的内容保存在 response 的变量中,可以直接使用以下方法来获取属性值

response.body
response.headers
response.headers['Server']

response

由于在 response 中使用 XPath、CSS 查询十分普遍,因此,Scrapy 提供了两个实用的快捷方式:

response.css()
response.xpath()

比如,我们获取该网页下的 title 标签,方法如下:

>>> response.css("title")
[<Selector xpath='descendant-or-self::title' data='<title>Example website</title>'>]
>>> response.xpath("//title")
[<Selector xpath='//title' data='<title>Example website</title>'>]

.xpath() 以及 .css() 方法返回一个类 SelectList 的实例,它是一个新选择器的列表。这个 API 可以用来快速的提取嵌套数据。

为了提取真实的原文数据,需要调用 .extract() 等方法

提取数据

extract():返回选中内容的Unicode字符串。

extract_first():SelectorList专有,返回其中第一个Selector对象调用extract方法。通常SelectorList中只含有一个Selector对象的时候选择调用该方法。

re() 使用正则表达式来提取选中内容中的某部分。

举个例子

>>> selector.xpath('.//b/text()') .extract() 
[‘价格:99.00元’,‘价格:88.00元’,‘价格:88.00元’]
>>> selector.xpath('.//b/text()').re('\d+\.\d+')        
[ '99.00','88.00','88.00']

re_first() 返回SelectorList对象中的第一个Selector对象调用re方法。

>>> selector.xpath('.//b/text()').re_first('\d+\.\d+')   
 '99.00'
css语法简单介绍

" * " 选择所有节点
" # container " 选择id为container的节点
" .container " 选择class包含container的节点
"li a " 选择 所有 li 下的所有 a 节点
“ul + p” 选择所有ul后面的第一个p元素
“#container > ul” 选择id为container的第一个ul节点
"a[class] " 选取所有有class属性的a元素
“a[href=“http://b.com”]” 含有href="http://b.com"的a元素
"a[href*=‘job’] " 包含job的a元素
"a[href^=‘https’] " 开头是https的a元素
“a[href$=‘cn’]” 结尾是cn的a元素

我们以上面的样例网页为例
下面是样例的html的源码

<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 
<link rel="stylesheet" href="/10994125-6b4dfbe961384f54928ea988268cedc6.css?1554613507" type="text/css"/>
<script language="javascript" type="text/javascript" src="/10994125-ea42c7db7c884a6691551d5756c02302.js?1554613507" charset="utf-8"></script>
</head>
 <body>
  <div id='images'>
   <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
  </div>
 </body>
</html>
css用法实例
>>> response.css("title ::text").extract_first('')   # 获取文本
'Example website'

>>> response.css("#images ::attr(href)").extract()   # 获取 id= images 下的所有href属性
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

>>> response.css('a[href*=image]::attr(href)').extract()   # 获取所有包含 image 的 href 属性
['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']


>>> response.css("#images a")[0].css("::attr(href)").extract()  # css选取第一个a标签里面的href属性
['image1.html']

>>> response.xpath(".//div[@id='images']/a[1]").xpath("@href").extract()  # xpath选取第一个a标签里面的href属性
['image1.html']




css用法实战

目标地址:中国大学校花网
http://www.xiaohuar.com/hua/

爬虫整体思路:
1、先将总页数拿下来
2、根据总页数循环去拿图片地址
3、再请求图片链接,将图片保存到本地

F12打开浏览器开发者工具,找到尾页再网页源码中的位置

总页数

可以看到尾页链接在 a 标签列表里面的末尾,在 css 中我们可以使用切片的方法来获取最后一个值
语法如下:

total_pages = selector.css(".page_num a")[-1:].css("::attr(href)").re(r".*?(\d+).html")[0]   # css
total_pages = selector.xpath(".//div[@class='page_num']/a")[-1:].xpath("@href").re(r".*?(\d+).html")[0]   # xpath

总页数

同样的方法(不细说了),我们获取图片的地址和名称
语法如下:

img_list = selector.css(".item_list.infinite_scroll .item_t .img")
for img in img_list:
    title = img.css("a img ::attr(alt)").extract_first("")
    src = img.css("a img ::attr(src)").extract_first("")

图片信息

因为只是用来测试,所以我只爬了前几页,如果想爬全部,将循环的页数改成 total_pages 即可
最终效果如下:

校花图

不到2分钟,就全部爬完了,因为是爬虫入门的教程,所以就没用异步的爬虫框架,下面是源码

# coding: utf-8
import requests
import time
from scrapy import Selector
import os


class XiaoHuaSpider(object):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }

    def spider(self):
        """
        爬虫入口
        :return:
        """
        url = "http://www.xiaohuar.com/hua/"
        response = requests.get(url, headers=self.headers)
        selector = Selector(text=response.text)
        total_pages = selector.css(".page_num a")[-1:].css("::attr(href)").re(r".*?(\d+).html")[0]  # 总页数
        self.parse_html(selector)  # 第一页爬取

        for page in range(1, 5):  # 第二页至第五页
            url = f"http://www.xiaohuar.com/list-1-{page}.html"
            response = requests.get(url, headers=self.headers)
            selector = Selector(text=response.text)  # 创建选择器
            self.parse_html(selector)  # 解析网页

    def parse_html(self, selector):

        img_list = selector.css(".item_list.infinite_scroll .item_t .img")
        for img in img_list:
            title = img.css("a img ::attr(alt)").extract_first("")
            src = img.css("a img ::attr(src)").extract_first("")

            if "file" in src:  # 第一个图片和其他图片地址不一样
                src = "http://www.xiaohuar.com" + src
            img_res = requests.get(src, headers=self.headers)
            data = img_res.content
            self.save_img(title, data)

    @staticmethod
    def save_img(title, data):
        """
        保存图片到本地
        :param title: 
        :param data: 
        :return: 
        """
        os.chdir("F:\\测试\\校花")   # 需要先在本地创建此目录
        if os.path.exists(title + ".jpg"):
            print(f"{title}已存在")
        else:
            print(f"正在保存{title}")
            with open(title + ".jpg", "wb")as f:
                f.write(data)


if __name__ == '__main__':
    spider = XiaoHuaSpider()
    t1 = time.time()
    spider.spider()
    t2 = time.time()
    print(t2 - t1)

在这里插入图片描述

微信小程序导航栏滑动一定距离后固定到顶部 接上一篇文章的内容,通常在一个页面中部会有一个导航栏查看不同的内容,这篇文章旨在实现在页面下滑的过程中导航栏自动固定到顶部以便我们阅读过程中的切换。 下滑一段距离后自动固定到顶部 首先,思考这个功能应该是怎么实现的: 在页面下滑的过程中,我们希望系统应当能识别下滑了多少距离,当原本的导航栏逐渐被遮住以后(遮住意味着下滑了特定距离),触发这个功能,执行另一种样式,将导航栏固定在页面顶端,同时如果我们将页面往上滑,系统能识别到原来的导航栏能露出来了(即距离顶端的高度小于一个特定的值),这时候又执行最初的样式 阅读详情

相关推荐

07- Rossmann商店销售预测 (Xgboost集成算法) (项目七)

Rossmann在欧洲国家经营着3000多家日化用品超市。目前,Rossmann商店经理的任务是提前6周预测他们的日销售额。商店的销售受到许多因素的影响,包括促销、竞争、学校和国家假日、季节性和地域性。由于数以千计的管理者根据自己的特殊情况预测销售,结果的准确性可能会有很大的差异。 因此使用机器学习算法对销量进行预测,Rossmann要求预测德国1115家商店的6周日销售额。可靠的销售预测使商店经理能够制定有效的员工时间表,提高生产力和积极性。

March_A的博客 2462

【Python】爬虫-----数据解析之CSS解析

如何使用CSS解析数据? 1.导入所需模块 import parsel 2.把要解析的数据转化为Selector对象 selector = parsel.Selector(要解析的内容) 3.调用css函数输入解析规则 定位class里的h1,并拿到它里面的内容: selector.css('.bookname h1::text').get() 定位id,并拿到它里面的内容: selector.css('#content::text').getall() #getall()

CNSamRol的博客 5900

WorkBuddy任务对话上下文管理:Token、compact与上下文窗口实战指南

在大语言模型应用中,Token作为文本处理的最小单位,直接决定上下文窗口的消耗速度,而上下文窗口则限定了单次对话可承载的信息总量。当对话超出窗口限制时,compact压缩机制会触发有损摘要,导致关键约束丢失或工具调用结果被稀释。合理管理上下文不仅能提升多步骤任务的稳定性,还能显著降低Token成本与响应延迟。在文档处理、代码开发、多步自动化等场景中,通过主动压缩、状态外置、分段喂入等策略,可有效避免任务后期遗忘、版本混乱等问题。本文围绕WorkBuddy的上下文管理机制,从Token与compact的底层原

weixin_29055699的博客 391

解析html:CSS Selector快速了解使用

CSS即层叠样式表,其选择器是一种用来确定HTML文档中某部分位置的语言。 html文档是由一系列节点构成的数,例如: <html> <body> <div > <p>Hello world<p> <a href="/home">Click here</a> </div> </body> </html> 一、html文档的节点类型 html文档的节点类型常

灰哥数据智能的专栏 2049

【CubeMX】STM32G474 HRTIM 互补PWM与死区时间配置实战

本文详细介绍了如何使用STM32CubeMX配置STM32G474的高分辨率定时器HRTIM生成互补PWM波形并精确设置死区时间。通过实战步骤讲解时钟配置、死区计算与高级功能,帮助工程师在电机驱动和电源应用中实现精准控制,避免上下桥臂直通风险。

grpc6streamer的博客 727

从JX-2R-01热敏打印机芯到稳定打印:硬件设计与时序控制的实践指南

本文详细解析了JX-2R-01热敏打印机芯的硬件设计与驱动开发全流程。核心内容包括:实现严格的双电源上电时序控制、采用PWM恒流驱动步进电机确保走纸平稳,以及精确控制SPI数据加载与加热脉冲时序以获得清晰打印效果。文章提供了从电路设计、芯片选型到代码调试的实战指南,旨在帮助开发者构建稳定可靠的热敏打印模块。

weixin_29169899的博客 221

爬虫入门经典(二十一) | 破解CSS加密之爬取大众点评

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.youkuaiyun.com/。 PS:由于现在越来越多的人未经本人同意直接爬取博主本人.

不温卜火 8万+

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

Python爬虫实例(3)--BeautifulSoup的CSS选择器

bs4 css选择器 爬虫使用CSS选择器 爬虫抓取小说章节目录

qq_34786604的博客 2181

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 471

浅谈银行内部户治理

为避免该问题的发生,对内部户入账类交易,或内部户是可透支的账户(如系统间往来),可考虑通过异步方式更新账户余额(当然,根本上还是要考虑银行业务量的实际,异步消息接口很多时候没有同步接口方便),另外,在进行内部户余额更新时,可以通过定时的借贷方发生额轧差的方式,将多次的锁请求,简化为一次(当然,发生额明细本身在加工账户交易历史时,是不能汇总的)。内部户在银行系统中,属于业务属性较少,实现相对简单,原理也很容易讲清的系统,但管中窥豹,越是基础的东西,越能看出一家银行业务、内控的专业程度。

银行信息系统应用架构详解 789

爬虫之CSS选择器的使用(BeautifulSoup)

CSS选择器的使用(BeautifulSoup) 1、CSS选择器概述 BeautifulSoup支持大部分的CSS选择器。 语法为:向tag对象或BeautifulSoup对象的.select()方法中传入字符串参数,选择的结果以列表形式返回,即返回类型为list。 tag.select(&amp;amp;quot;string&amp;amp;quot;) BeautifulSoup.select(&amp;amp;quot;string&amp;amp;quot

简之的通向技术之路 8211

SAP Joule Studio 全景解析

摘要:SAP Joule Studio是SAP Build平台中的低代码/专业级复合工作台,用于构建和管理企业专属的Joule智能体与技能。它支持通过拖拽和声明式编排实现跨系统任务自动化,与SAP及第三方系统集成。核心构件包括Agent(智能体)、Skill(技能)、Action(动作)和Project(项目)。Joule Studio强调企业级落地,与SAP Build Process Automation等工具协同,实现从设计到运行的全生命周期管理。典型应用场景包括供应链补货、财务关账和人力服务台自动化

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 395

beautifulsoup网页爬虫解析_爬虫网页解析之css用法及实战爬取中国校花网

前言 我们都知道,爬虫获取页面的响应之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来,python从网页中提取数据的包很多,常用的解析模块有下面的几个:BeautifulSoup API简单 但解析速度慢,不推荐使用lxml 由C语言编写的xml解析库(libxm2),解析速度快 但是API复杂Scrapy 综合以上两者优势实现了自己的数据提取机制,被称为Selector选择...

weixin_39543478的博客 317

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

php 根据css爬内容,爬虫网页解析之css用法及实战爬取中国校花网

前言我们都知道,爬虫获取页面的响应之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来,python从网页中提取数据的包很多,常用的解析模块有下面的几个:BeautifulSoup API简单 但解析速度慢,不推荐使用lxml 由C语言编写的xml解析库(libxm2),解析速度快 但是API复杂Scrapy 综合以上两者优势实现了自己的数据提取机制,被称为Selector选择器。它是由l...

weixin_36193418的博客 569

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

用Python爬取中国校花网后,我发现她们都有个共同点

我们都知道,爬虫获取页面的响应之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来, python从网页中提取数据的包很多,常用的解析模块有下面的几个: BeautifulSoup API简单 但解析速度慢,不推荐使用 lxml 由C语言编写的xml解析库(libxm2),解析速度快 但是API复杂 Scrapy 综合以上两者优势实现了自己的数据提取机制,被称为Selector选择...

Pythoncxy的博客 561

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python爬虫中的数据分析------css选择器详解

python爬虫中的数据分析------css选择器详解

m0_74459049的博客 2420

python爬虫Xpath和CSS选择器的使用例子

最近学习用 Scrapy 框架写爬虫,简单来说爬虫就是从网上抓取网页,解析网页,然后进行数据的存储与分析,将从网页的解析到数据的转换存储。将学习过程中用到的解析技术,Scrapy 的各个模块使用与进阶到分布式爬虫学到的知识点、遇到的问题以及解决方法记录于此,以作总结与备忘。 # -*- coding: GBK -*- import scrapy from scrapy.selector impo...

weixin_44357283的博客 1571

python requests爬取一个网站所有前端的css+js+图片资源

直接放代码 # -*- coding:utf-8 -*- # Author: cmzz # @Time :19-3-2 import re import requests import os def get_html(url): headers = { 'content-type': 'application/json', 'User-Agent': 'Mozilla/...

DETACH-MENT的博客 7848

scrapy框架开发爬虫实战——css语法

css选择器 CSS即层叠样式表, 其选择器是一种用来确定HTML文档中某部分位置的语言。 CSS选择器的语法比XPath更简单一些, 但功能不如XPath强大。 实际上, 当我们调用Selector对象的CSS方法时, 在其内部会使 用Python库cssselect将CSS选择器表达式翻译成XPath表达式, 然后调用Selector对象的XPATH方法。 css基本语法表 ...

万锦 1098

【爬虫】2.5 BeautifulSoup使用 CSS 语法查找元素

BeautifulSoup使用 CSS 语法查找元素 1. 使用 CSS 语法 2. 属性的语法规则 3. Select 查找子孙结点 4. Select 查找直接子结点 5. Select 查找兄弟结点

Jack 1987

【Python爬虫学习】七、淘宝商品价格爬取(成功爬取)

写在前面:修改request的headers属性,可以跳过登录界面,爬取成功 功能描述: 目标:获取淘宝搜索页面信息,提取其中商品的名称和价格 技术路线:Requests-Re 接口描述: 搜索接口:https://s.taobao.com/search?q=篮球 翻页接口:第二页https://s.taobao.com/search?q=篮球&s=44 ...

Guanhai1617的博客 2万+
上一篇: Python爬虫进阶之APP逆向(二)
下一篇: 一键生成合成微信好友墙
全村之希望
博客等级 码龄8年 9749粉丝 98原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全村之希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值