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

尚硅谷爬虫note14

一、scrapy

scrapy:为爬取网站数据是,提取结构性数据而编写的应用框架

1. 安装

        pip install scrapy

或者,国内源安装

        pip install scrapy -i https://pypi.douban.com/simple

2. 报错

        报错1)building ‘twisted.test.raiser’ extension

原因:缺少twisted库

解决:下载twisted库:

        a)cp是python版本

        b)amd是操作系统版本

        安装twisted库:

        使用:pip install 拖入twisted路径

twisted库安装完成后,再安装scrapy库

        报错2)提示python -m pip install --upgrade pid

   解决:运行python -m pip install --upgrade pid

        报错3)win32错误

  解决:pip install pypiwin32

        仍然报错)

        解决:安装Aanacoda工具

二、创建scrapy项目

1)创建scrapy项目

在终端中创建项目:

        scrapy startproject 项目名

2)创建爬虫文件

       在spiders文件夹中创建爬虫文件

a)切入spiders目录下:

        cd  项目名\项目名\spiders

 b) 在spiders文件夹中创建爬虫文件

        scrapy genspider 文件名 要爬取的网页

 一般情况下,要爬取的网页之前:不需要添加http协议

        否则start-urls中的路径不成立

  原因:start_urls的值是根据allowed_domains进行修改的,如果添加了http协议,allowed_domains的值需要用户手动修改

import scrapy


class Demo001Spider(scrapy.Spider):
    # 爬虫的名字:用于运行爬虫时,使用的值
    name = "demo001"
    # 允许访问的域名
    allowed_domains = ["www.baidu.com"]
    # 起始url地址:指的是第一次要访问的域名
    # start_urls是在allowed_domains之前添加1个http://  在allowed_domains之后添加1个/
    start_urls = ["http://www.baidu.com"]
#执行了 start_urls之后执行的方法    方法中的response就是返回的对象 相当于1)response = urllib.requests.urlopen()    2)response = requests.get()
    def parse(self, response):
        pass

 3)运行爬虫文件

scrapy crawl 爬虫的名字

 

做了反扒————

 解决:注释掉君子协议:项目下的setting.py文件中的robots.txt协议

注释掉:ROBOTSTXT_OBEY = True

 

 三、scrapy项目结构

项目名

        项目名

                spider文件夹        (存储爬虫文件)

                        init        

                        自定义的爬虫文件        (核心功能文件)

                init

                items        (定义数据结构的地方)(爬取的数据包含哪些)

                middleware        (中间件)(代理)

                pipelines        (管道)(处理下载的数据)

                settings        (配置文件)

四、response的属性和方法

3)4)5)常用

1)response.text

        获取响应的字符串

2)response.body

        获取响应的二进制数据

3)response.xpath

        直接使用xpath方法解析response中的内容

4)response.extract()

        提取selector对象中的data属性值

5)response.extract_first()        

        提取selector对象的第一个数据

五、scrapy工作原理

1). 引擎向spiders要url

2). 引擎将要爬取的url给调度器

3). 调度器将url生成请求对象,放入指定的队列

4). 从队列中出队一个请求

5). 引擎将请求交给下载器进行处理

6).下载器发送请求,向互联网请求数据

7). 下载器将数据返回给引擎

8). 引擎将数据再次给到spiders

9).spiders通过xpath解析数据

10).  spiders将数据,或者url,给到引擎

11). 引擎判断该数据,是数据,还是url

        a)是数据,交给管道处理

        b)还是url,交给调度器处理

六、scrapy shell

        scrapy终端

测试xpath和css表达式

免去了每次修改后,运行spiders的麻烦

进入scrapy shell终端:

        直接在Windows终端输入:scrapy shell 域名

        使用

                终端中直接执行:

                        scrapy shell 域名

安装ipython(高亮,补全)

        pip install ipython

七、懒加载中的src

有data-original,src用data-original替代

替换前:src = // ul[ @ id = "component_59"] / li // img / @ src
替换后:src = // ul[ @ id = "component_59"] / li // img / @ data-original

当当网练习中的第一张图片是none

        原因:没有data-original

 #有data-original,src用data-original替代
        src = li.xpath('.//img/@data-original').extract_first()
        # 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的   其他图片的地址是data-original
        if src:
            src = src
        else:
            #用src
            src = li.xpath('.//img/@src').extract_first()

当当网:

        items.py:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
from urllib import response

import scrapy


class DemoDdwItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # pass
    #图片
    # src = // ul[ @ id = "component_59"] / li // img / @ src
    src = scrapy.Field()
    #名字
    # alt = // ul[ @ id = "component_59"] / li // img / @ alt
    name = scrapy.Field()
    #价格
    # price = //ul[@id = "component_59"]/li//p[@class = "price"]/span[1]/text()
    price = scrapy.Field()
   

ddw.py

import scrapy


class NddwSpider(scrapy.Spider):
    name = "nddw"
    allowed_domains = ["category.dangdang.com"]
    start_urls = ["https://category.dangdang.com/cp01.07.30.00.00.00.html"]

    def parse(self, response):
        # pass
        # src、name、price都有共同的li标签
        # 所有的selector对象,都可以再次调用xpath方法
        li_list = response.xpath('//ul[@id = "component_59"]/li')

        for li in li_list:
            # .extract()提取数据
            # 有data-original,src用data-original替代
            src = li.xpath('.//img/@data-original').extract_first()
            # 第一张图片和其他图片标签不一样,第一张图片的src是可以使用的   其他图片的地址是data-original
            if src:
                src = src
            else:
                # 用src
                src = li.xpath('.//img/@src').extract_first()
            alt = li.xpath('.//img/@alt').extract_first()
            price = li.xpath('.//p[@class = "price"]/span[1]/text()').extract_first()
            print(src, name, price)

相关文章:

  • ZooKeeper 基本概述
  • 意向锁的目的
  • 探索数据仓库自动化:ETL流程设计与实践
  • 【Pandas】pandas Series swaplevel
  • Python爬虫实战:一键采集电商数据,掌握市场动态!
  • 自然语言处理(NLP)中文文本预处理主流方法
  • python中采用opencv作常规的图片处理的方法~~~
  • 华为OD机试-发现新词的数量(Java 2024 E卷 100分)
  • Kafka 消息不丢失:全方位保障策略
  • redis菜鸟教程
  • 【MATLAB源码-第271期】基于matlab的雷达发射回波模拟,包括匹配滤波,加窗旁瓣控制,以及MTD处理。
  • C++ STL string容器全解析
  • 解锁健康密码,踏上养生之旅
  • 《基于WebGPU的下一代科学可视化——告别WebGL性能桎梏》
  • 【Linux篇】版本控制器-Git
  • OpenHarmony研发工具链子系统
  • Dify框架下的基于RAG流程的政务检索平台
  • 计算机毕业设计Python+DeepSeek-R1大模型微博的话题博文及用户画像分析系统 微博舆情可视化(源码+ 文档+PPT+讲解)
  • JPA编程,去重查询ES索引中的字段,对已有数据的去重过滤,而非全部字典数据
  • ETL系列-数据加载(Load)
  • 有专业做网站的吗gre考/爱站网关键词
  • 网站建设创意/郑州网络推广平台
  • 凡科网代理登录/谷歌seo服务
  • 新闻网站建设合同/北京网站制作设计
  • 福州做网站的公司多少钱/互联网舆情监测系统
  • 网站软件设计/seo知识培训