scrapy快速上手

news2024/11/17 21:56:07

安装

        除了scrapy本身还要安装两个库 

pip install scrapy
pip install pywin32
pip install wheel

 创建项目

在要创建项目的地方打开powershell

scrapy startproject 项目名

我们得到这样的项目结构,功能如下 

  1.         scrapy.cfg                项目的主配置信息
  2.         items.py                   设置项目模板,用于结构化数据
  3.         piplines.py                数据的持久化处理
  4.         seting                        配置文件
  5.         spiders                       爬虫文件目录

配置信息

seeting.py下修改是否支持数据爬取修改为允许,true不允许,false允许

  

 将这一行的内容改为false

配置浏览器请求头中的user-agent

根据网站反爬措施制定其他的配置 

配置模板

        items.py中照着给出的格式配置自己的数据模板

        变量名 = scrapy.Field()

创建爬虫文件

指定爬取目标

 回到powershell,

cd 项目名
scrapy genspider 爬虫文件名 爬取目标网址

得到这样一个文件

import scrapy

class QuotesSpider(scrapy.Spider):
    # 爬虫名
    name = "quotes"
    allowed_domains = ["quotes.toscrape.com"]
    # 爬取目标
    start_urls = ["https://quotes.toscrape.com/"]
    # 爬取动作
    def parse(self, response):

寻找元素和内容

在parse方法中定义爬取动作 ,参数列表中的response是爬取目标的响应对象。

具有如下属性

  1. url:响应的 URL 地址。
  2. status:HTTP 状态码,如 200 表示成功,404 表示未找到等。
  3. headers:响应的 HTTP 头部信息,是一个类似字典的对象。
  4. body:响应体,即服务器返回的内容,是一个字节串(bytes)。
  5. text:响应体的字符串形式,如果响应的 Content-Type 是文本类型(如 HTML),则可以直接使用此属性获取内容。
  6. encoding:响应的编码方式,用于将 body 转换为 text
  7. meta:传递给响应的元数据信息,常用于在请求和响应之间传递数据。
  8. request:触发此响应的请求(Request)对象。

具有如下方法

  1. xpath():用xpass寻找元素
  2. css():用css寻找元素
  3. urljoin():构造网址
  4. get() 和 getall(): 这两个方法用于从SelectorSelectorList对象中提取数据。get()方法返回第一个匹配节点的文本或属性值(如果指定了属性),而getall()方法返回所有匹配节点的文本或属性值列表。
  5. extract() 和 extract_first(): 这两个方法是旧版本Scrapy中用于提取数据的方法,但在新版本中,推荐使用get()getall()方法。extract()方法返回所有匹配节点的文本列表,而extract_first()方法返回第一个匹配节点的文本。
  6. re(regex, replace_entities=True) 和 re_first(regex, default=None, replace_entities=True): 这两个方法允许你使用正则表达式来提取匹配的数据。re()方法返回所有匹配的字符串列表,而re_first()方法返回第一个匹配的字符串。
  7. attrib: 这是一个属性字典,用于访问当前节点的属性。如果当前对象是SelectorList,则attrib将返回列表中第一个元素的属性字典。

        使用xpath和css方法寻找元素的时候如果返回多个值的时候添加.extract()返回的是str类型列表,单个值则为.extract_first(),返回的是str类型


text = q.xpath(".//span[@class='text']/text()").extract_first()
author = q.xpath('.//span/small[@class="author"]/text()').extract_first()   
tags = q.xpath('.//div[@class="tags"]/a[@class="tag"]').extract()

        这样找到的元素可以直接被bs4解析并获取值。

将结果组成模板

        首先导入item,并在要组成模板的位置实例化一个ScrapydemoItem对象

from scrapydemo.items import ScrapydemoItem

item = ScrapydemoItem()#在你要组成模板的位置写

         为实例属性赋值

item["text"] = text
item["author"] = author
item["tags"] = tags

        结束爬虫        yield类似return,但是可以循环返回

yield item

         每返回一个item会写入一条数据

        当然也可以不返回item,获取到下一个页面的url即可继续访问下一个页面

        # 获取访问下一页地址
        next = response.css('.pager .next .a::attr(href)').extract_first()  # 两个冒号获取属性值
        # 合成绝对路径
        url = response.urljoin(next)
        # 访问请求的回调函数
        # 第三个参数是关闭地址过滤
        yield scrapy.Request(url=url,callback=self.parse,dont_filter=True)

         这样就可以调用自己继续访问下一页了

创建启动项

创建main.py 

from scrapy import cmdline

cmdline.execute("scrapy crawl quotes -o quotes.json".split())
#                scrapy crawl 爬虫名  -o代表文件流  创建quotes.json这个文件

        也可以在cmd或powershell中输入字符串中的值 

爬取scrapy官方靶站的示例代码:

import scrapy

from scrapydemo.items import ScrapydemoItem


class QuotesSpider(scrapy.Spider):
    # 爬虫名
    name = "quotes"
    allowed_domains = ["quotes.toscrape.com"]
    # 爬取目标
    start_urls = ["https://quotes.toscrape.com/"]
    # 爬取动作
    def parse(self, response):
        # 获取页面中的元素返回列表
        quote = response.xpath('//div[@class="quote"]')
        # 遍历列表每个元素
        for q in quote:
            text = q.xpath(".//span[@class='text']/text()").extract_first()    # 获取内容
            author = q.xpath('.//span/small[@class="author"]/text()').extract_first()    # 获取作者
            tags = q.xpath('.//div[@class="tags"]/a[@class="tag"]').extract()    # 获取标签

            # 实例化
            item = ScrapydemoItem()
            # 为实例属性赋值
            item["text"] = text
            item["author"] = author
            item["tags"] = tags
            # 返回数据,相当于return,但是可以循环返回。
            yield item
        # 获取访问下一页地址
        next = response.css('.pager .next .a::attr(href)').extract_first()  # 两个冒号获取属性值
        # 合成绝对路径
        url = response.urljoin(next)
        # 访问请求的回调函数
        # 第三个参数是关闭地址过滤
        yield scrapy.Request(url=url,callback=self.parse,dont_filter=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2175650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的智能人脸识别门锁系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 摄像头模块数据采集人脸识别与门锁控制OLED显示与报警功能应用场景结论 1. 引言 随着物联网(IoT)和人工智能(AI)技术的发展,智…

ERROR [internal] load metadata for docker.io/library/openjdk:8

ERROR: failed to solve: DeadlineExceeded: DeadlineExceeded: DeadlineExceeded: openjdk:8: failed to do request: Head “https://registry-1.docker.io/v2/library/openjdk/manifests/8”: dial tcp 202.160.129.6:443: i/o timeout 在构建docker镜像时从docker.io/libr…

Unity中的功能解释(数学位置相关和事件)

向量计算 Vector3.Slerp(起点坐标,终点坐标,t),可是从起点坐标以一个圆形轨迹到终点坐标,有那么多条轨迹,那怎么办 Vector3.Slerp 进行的是沿球面插值,因此并不是沿着严格的“圆形…

Ubuntu 离线安装 docker

1、下载离线包,网址:https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/ 离线安装docker需要下载3个包,containerd.io ,docker-ce-cli,docker-ce 2、下载完毕后拷贝到ubuntu上用 dpkg 命令安装&am…

【d53】【Java】【力扣】24.两两交换链表中的节点

思路 定义一个指针cur, 先指向头节点, 1.判断后一个节点是否为空,不为空则交换值, 2.指针向后走两次 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*…

浅谈java异常[Exception]

一. 异常的定义 在《java编程思想》中这样定义 异常:阻止当前方法或作用域继续执行的问题。虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常。绝对一点说异常就是某种意义上的错误&#xf…

制造业智能化建设的指标详解

制造业智能化建设的关键监测指标文章浏览阅读284次。10. |绿色化、安全及可靠性|8. |产品全生命周期管理|2. |生产数据自动采集率|4. |数据存储与分析能力|2. |生产数据自动采集率|4. |数据存储与分析能力|5. |企业数字化转型成效|2. |数据中心服务能力|1. |自动化设备应用|2. …

2024年9月25日,Intel发布至强6900P系列:128核心504MB缓存,终于追上AMD!

各位高性能计算领域的朋友们,你们期待已久的消息来了! 添加图片注释,不超过 140 字(可选) Intel终于发布了至强6900P系列,这款全新的高性能计算(HPC)服务器处理器,不仅在…

怎样将多个视频合并成一个?7种无损视频合并技巧,1分钟剪辑出大片!

随着社交媒体和视频平台的兴起,身边很多人都开始拍摄vlog来记录自己的生活。剪辑视频最常见的需求就是视频合并,将多个视频合并成一个。视频合并算是比较简单的视频剪辑操作,现在有很多软件支持视频合并功能,本文整理了几个比较简…

windows下载安装pycharm社区版

文章目录 🌕下载pycharm社区版🌕安装🌕配置 如下内容的系统和pycharm版本: windows10系统 PyCharm Community Edition 2024.2.3🌕下载pycharm社区版 https://www.jetbrains.com.cn/en-us/pycharm/download/? sectio…

蓝桥杯—STM32G431RBT6(TIM定时器输入捕获频率和占空比)

一、什么是输入捕获?对比输出捕获区别? 输入捕获是指对输入信号的特定事件进行检测和记录它主要用于测量输入信号的时间间隔、频率等参数。而输出捕获则是对输出信号的特定事件进行控制和监测。两者的主要区别在于作用对象不同,输入捕获关注的…

JavaWeb图书借阅系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优…

2022浙江省赛G I M

G - Easy Glide 题意 思路 由于数据范围比较小&#xff08;1e3&#xff09;,把所有的移动的时间转化为图论上的边权就可以了,再用dijkstra解决,注意如果用的是邻接表存的话要建双向边 代码 #include <map> #include <set> #include <queue> #include <…

【Linux】修改用户名用户家目录

0、锁定旧用户登录 如果旧用户olduser正在运行中是无法操作的&#xff0c;需要先禁用用户登录&#xff0c;然后杀掉所有此用户的进程。 1. 使用 usermod 命令禁用用户 这将锁定用户账户&#xff0c;使其无法登录&#xff1a; sudo usermod -L olduser2. 停止用户的进程 如…

Python中的机器学习:从入门到实战

机器学习是人工智能领域的一个重要分支&#xff0c;它通过构建模型来使计算机从数据中学习并做出预测或决策。Python凭借其丰富的库和强大的生态系统&#xff0c;成为了机器学习的首选语言。本文将从基础到实战&#xff0c;详细介绍如何使用Python进行机器学习&#xff0c;涵盖…

论文解读 | ACL'24最佳论文:利用扩散模型破译甲骨文语言

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 管海粟&#xff0c;华中科技大学本科生在读。 主要研究方向为图像生成、图像分割、多模态大模型。获得国家奖学金、校三好学生奖学金、华中科技大学本科特…

开源AI智能名片小程序源码:私域电商构建独特竞争力的新机遇

摘要&#xff1a;本文旨在探讨私域电商如何利用开源AI智能名片小程序源码构建独特竞争力。在强调独特性是通向成功的必要条件的基础上&#xff0c;分析开源AI智能名片小程序源码在私域电商发展独特性方面的作用及相关策略。 一、引言 在竞争激烈的商业环境中&#xff0c;让自己…

西陆家政系统V1.0.1

微信小程序开发的西陆家政服务管理系统小程序 V1.0.1bug修复优化 1.修复首页轮播不能自动轮播问题;2.修复订单详情价格显示问题;3.修复在开放城市模式下,其他城市可以下单问题;4.修复个人二维码跳转小程序路径异常问题;5.修复小程序编辑我的地址选择定位后不刷新问题&#xf…

LeetCode 每周算法 8(栈、堆)

LeetCode 每周算法 8&#xff08;栈、堆&#xff09; 栈算法&#xff1a; class Solution { public: // 判断括号是否有效的函数 bool isValid(string s) { int n s.size(); // 获取字符串s的长度 // 如果字符串长度为奇数&#xff0c;则括号无法有效匹配&#xff0c;直…

利用多模态输入的自我中心运动跟踪与理解框架:EgoLM

随着增强现实(AR)和虚拟现实(VR)技术的发展,对自我中心(第一人称视角)运动的精确跟踪和理解变得越来越重要。传统的单一模态方法在处理复杂场景时存在诸多局限性。为了解决这些问题,研究者们提出了一种基于多模态输入的自我中心运动跟踪与理解框架——EgoLM。本文将详细…