Scrapy:简单使用、xpath语法

简单使用

简介

Scrapy 是一个为了爬取网站信息,提取结构性数据而编写的应用框架,可以用于数据挖掘、检测和自动化测试。

架构

  • 组件

    • ·引擎,指挥其他组件协同工作
    • 调度器 ,接收引擎发过来的请求,按照先后顺序,压入队列中,同时去除重复的请求
    • 下载器,用于下载网页内容,并将网页内容返回给爬虫
    • 爬虫,用于从特定网页中提取需要的信息
    • 项目管道,负责处理爬虫从网页中抽取的实体,主要的功能是持久化、验证实体的有效性、清除不需要的信息
    • 下载器中间件,介于引擎和下载器之间,主要处理Scrapy引擎与下载器之间的请求及响应
    • 爬虫中间件,介于引擎和爬虫之间,主要工作是处理爬虫的响应输入和请求输出
  • 数据流

简单使用

爬取 起点中文网月票榜 的小说名称、作者、类型

安装

java 复制代码
pip install scrapy

创建项目

java 复制代码
scrapy startproject qidian_yuepiao

目录结构


实现

spiders目录下创建爬虫源文件qidian_yuepiao_spider.py

java 复制代码
scrapy genspider dingdian_xuanhuan https://www.xiaoshuopu.com/

其中scrapy genspider创建爬虫的命令,dingdian_xuanhuan爬虫名称,https://www.xiaoshuopu.com/要爬取的网站

想爬取起点的,但是有反爬,改成爬取 https://www.xiaoshuopu.com/class_1/

java 复制代码
import scrapy


class DingdianXuanhuanSpider(scrapy.Spider):
    # 爬虫名称
    name = "dingdian_xuanhuan"
    # 允许的域名
    allowed_domains = ["www.xiaoshuopu.com"]
    # 起始URL列表
    start_urls = ["https://www.xiaoshuopu.com/class_1/"]

    def parse(self, response):
        # 小说列表
        novel_list = response.xpath("//table/tr[@bgcolor='#FFFFFF']")
        print("小说数量是:", len(novel_list))
        # 循环获取小说名称、最新章节、作者、字数、更新、状态
        for novel in novel_list:
            # 小说名称
            name = novel.xpath("./td[1]/a[2]/text()").extract_first()
            # 最新章节
            new_chapter = novel.xpath("./td[2]/a/text()").extract_first()
            # 作者
            author = novel.xpath("./td[3]/text()").extract_first()
            # 字数
            word_count = novel.xpath("./td[4]/text()").extract_first()
            # 更新
            update_time = novel.xpath("./td[5]/text()").extract_first()
            # 状态
            status = novel.xpath("./td[6]/text()").extract_first()
            
            # 将小说内容保存到字典中
            novel_info = {
                "name": name,
                "new_chapter": new_chapter,
                "author": author,
                "word_count": word_count,
                "update_time": update_time,
                "status": status
            }
            print("小说信息:",novel_info)
            
            # 使用yield返回数据
            yield novel_info
            
java 复制代码
scrapy crawl dingdian_xuanhuan -o 玄幻.json

scrapy crawl爬虫的运行命令,dingdian_xuanhuan爬虫的名称,-o 玄幻.json输出格式,这个可以省略

支持的输出格式有:'json', 'jsonlines', 'jsonl', 'jl', 'csv', 'xml', 'marshal', 'pickle'

为什么使用yield返回数据

  • 内存效率
    • 节省内存:当处理大量数据时,如果直接将所有数据存储在列表或其他容器中再一次性返回,可能会消耗大量的内存。而使用 yield 可以逐个生成和处理数据项,这样可以大大减少内存的占用。
    • 按需生成:生成器只在需要的时候生成下一个值,这使得程序更加高效,尤其是在处理大数据集时。
  • 并发性和异步处理
    • 非阻塞:Scrapy 是基于 Twisted 异步网络库构建的,支持并发请求。使用 yield 可以使爬虫在等待某个请求响应时去处理其他任务,从而提高抓取效率。
    • 事件驱动:Scrapy 使用事件循环来管理多个请求和响应,yield 语句可以暂停当前函数的执行,让出控制权给事件循环,这样可以实现高效的异步操作。
  • 数据流处理
  • 管道化处理:在 Scrapy 中,你可以通过 yield 将数据传递到 Item Pipeline 进行进一步处理(如清洗、验证、存储等)。这种方式使得数据处理流程更加模块化和灵活。

xpath语法

简介

xpath 是一门在xml文档中查找信息的语言。htmlxml结构类似,因此也可以用在html

常用路径表达式

表达式 描述 示例
节点名称 选取此节点的所有子节点 div,p,h1
/ 从根节点选取(描述绝对路径) /html
// 不考虑位置,选取页面中所有子孙节点 //div
. 选取当前节点 ./div
.. 选取当前节点的父节点 h1/.../
@属性名 选取属性的值 @href
text() 获取元素中的文本节点 //h1/text()

示例

获取html元素

java 复制代码
xpath("/html")

获取网页编码格式

java 复制代码
xpath("//meta/@charset")

获取div的id属性值

java 复制代码
xpath("//div/@id")

获取属性id为abc的div元素

java 复制代码
xpath("//div[@id='abc']")

获取所有带有class属性的div元素

java 复制代码
xpath("//div[@class]")

获取div节点中第一个p元素的文本

java 复制代码
xpath("//div/p[1]/text()")

获取div节点中最后一个p元素的文本

java 复制代码
xpath("//div/p[last()]/text()")
相关推荐
北漂程序员学习3 天前
如何避免被目标网站识别为爬虫?
爬虫·python·scrapy·flask·scipy
爱吃泡芙的小白白4 天前
爬虫学习——Scrapy
爬虫·python·scrapy·学习记录
愚公搬代码5 天前
【愚公系列】《Python网络爬虫从入门到精通》056-Scrapy_Redis分布式爬虫(Scrapy-Redis 模块)
爬虫·python·scrapy
水w7 天前
【Python爬虫】详细入门指南
开发语言·爬虫·python·scrapy·beautifulsoup
水w9 天前
【Python爬虫】简单案例介绍3
开发语言·爬虫·python·scrapy·beautifulsoup
q5673152310 天前
使用Scrapy库结合Kotlin编写爬虫程序
爬虫·scrapy·kotlin
小白学大数据10 天前
Scrapy结合Selenium实现搜索点击爬虫的最佳实践
开发语言·chrome·爬虫·selenium·scrapy
q5673152311 天前
利用Ruby的Typhoeus编写爬虫程序
开发语言·爬虫·scrapy·ruby
q5673152314 天前
使用Java的HttpClient实现文件下载器
java·开发语言·爬虫·scrapy
q5673152315 天前
用Dispatch库的爬虫程序爬取图片网站
开发语言·爬虫·python·scrapy