当前位置: 首页 > article >正文

scrapy快速上手

安装

        除了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.kler.cn/news/328620.html

相关文章:

  • Mybatis-Plus新花样(二)
  • Robot Operating System——带有协方差矩阵的三维空间中的位姿(位置和方向)
  • 基于 Seq2Seq 的中英文翻译项目(pytorch)
  • 番外篇 | 复现AC-YOLOv5,进行自动化织物缺陷检测
  • Mybatis 9种动态 sql 标签使用
  • 基于深度学习的任务序列中的快速适应
  • 基于微信小程序的宿舍报修系统的设计与实现(lw+演示+源码+运行)
  • 正交阵的概念、性质与应用
  • 激光切割机适用材质有哪些
  • 证件照换底色免费
  • Nginx基础详解4(location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖)
  • Vue.js 组件开发
  • 【数据库】 MongoDB 查看当前用户的角色和权限
  • C++八股进阶
  • 【API安全】crAPI靶场全解
  • (void*) 是啥意思
  • 【Vue】为什么 Vue 不使用 React 的分片更新?
  • 重置linux后vscode无法再次使用ssh连接
  • C# HttpClient请求URL重定向后丢失Authorization认证头
  • 基于RustDesk自建远程桌面服务
  • 0基础学前端 day9--css布局
  • UI设计师面试整理-团队合作与沟通能力
  • 深度学习·wandb
  • 自然语言处理问答系统技术
  • html5 + css3(下)
  • STL容器适配器
  • OpenCV 形态学相关函数详解及用法示例
  • 字符串逆序
  • 滚雪球学MySQL[3.3讲]:MySQL复杂查询详解:CASE语句、自连接与视图管理
  • OpenCV视频I/O(11)视频采集类VideoCapture之设置视频捕获设备的属性函数 set()的使用