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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值