安装
除了scrapy本身还要安装两个库
pip install scrapy
pip install pywin32
pip install wheel创建项目
在要创建项目的地方打开powershell
scrapy startproject 项目名
我们得到这样的项目结构,功能如下
- scrapy.cfg 项目的主配置信息
- items.py 设置项目模板,用于结构化数据
- piplines.py 数据的持久化处理
- seting 配置文件
- 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是爬取目标的响应对象。
具有如下属性
- url:响应的 URL 地址。
- status:HTTP 状态码,如 200 表示成功,404 表示未找到等。
- headers:响应的 HTTP 头部信息,是一个类似字典的对象。
- body:响应体,即服务器返回的内容,是一个字节串(bytes)。
- text:响应体的字符串形式,如果响应的 Content-Type是文本类型(如 HTML),则可以直接使用此属性获取内容。
- encoding:响应的编码方式,用于将 body转换为text。
- meta:传递给响应的元数据信息,常用于在请求和响应之间传递数据。
- request:触发此响应的请求(Request)对象。
具有如下方法
- xpath():用xpass寻找元素
- css():用css寻找元素
- urljoin():构造网址
- get() 和 getall(): 这两个方法用于从Selector或SelectorList对象中提取数据。get()方法返回第一个匹配节点的文本或属性值(如果指定了属性),而getall()方法返回所有匹配节点的文本或属性值列表。
- extract() 和 extract_first(): 这两个方法是旧版本Scrapy中用于提取数据的方法,但在新版本中,推荐使用get()和getall()方法。extract()方法返回所有匹配节点的文本列表,而extract_first()方法返回第一个匹配节点的文本。
- re(regex, replace_entities=True) 和 re_first(regex, default=None, replace_entities=True): 这两个方法允许你使用正则表达式来提取匹配的数据。re()方法返回所有匹配的字符串列表,而re_first()方法返回第一个匹配的字符串。
- 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)

![ERROR [internal] load metadata for docker.io/library/openjdk:8](https://i-blog.csdnimg.cn/direct/397c9b0a0e1946c1bae6df7bde592099.png)



![浅谈java异常[Exception]](https://i-blog.csdnimg.cn/direct/c722ff4f91534e96aee00c56be1caa78.jpeg)












