【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架------基本原理和步骤+爬取当当网(基本步骤)

下载scrapy框架

scrapy安装视频链接

创建项目(项目文件夹不能使用数字开头,不能包含汉字)

cmd:

bash 复制代码
scrapy startproject 项目名称

创建爬虫文件

(1)第一步:先进入到spiders文件中(进入相应的位置)
bash 复制代码
cd 项目的名字\项目的名字\spiders
(2)第二步:创建爬虫文件
bash 复制代码
scrapy genspider 爬虫文件的名字 要爬取的网页网址
(3)第三步:查看创建的项目文件------检查路径是否正确

注意:不满足时需要手动修改(版本不同,造成的结果不一)

运行爬虫代码

bash 复制代码
scrapy crawl 爬虫的名字

查看robots协议------是否有反爬取机制------君子协议(修改君子协议)

(1)查看某网站的君子协议
(2)修改settings文件中君子协议

scrapy项目的结构

response的常用属性和方法

(1)爬去网站的源码数据

python 复制代码
content_1=response.txt

(2)爬去网站的二进制源码数据

python 复制代码
response.body

(3)xpath方法可以用来解析response中的内容

python 复制代码
response.xpath('')

(4)extract方法用来提取seletor对象的data属性值

python 复制代码
response.extract()

(5)extract_first方法用来提取seletor列表的第一个数据

python 复制代码
response.extract()

scrapy框架原理解析

scrapy sell 工具调试------具体下载不说明

(1)进入scrapy shell工具

python 复制代码
scrapy shell 网址

(2)可以看见有一个response对象

(3)可以对response对象进行操作调试(不用像项目一样每次多要运行项目,减少麻烦)

当当网爬取案例

1. 创建当当网爬虫项目
2. 检查网址
3. 在函数中打印一条数据,看是否网站有反爬机制

图1

图2

4. 定义数据结构------选择要爬取哪些属性
5. 去网址分析数据------拿到xpath表达式
(1)拿到图片
(2)拿到名字
(3)拿到价格
6. 编写函数

(1)懒加载处理

图1------非第一张图片(懒加载------有data-original)图2------第一张图片和其他的图片的属性值不一样

注:第一张可以用src,其他的用data-original

(2)代码解释如图:

7.运行后拿到数据
bash 复制代码
scrapy crawl 爬虫的名字
8.保存数据
(1)封装数据------yield提交给管道
(2)开启管道------保存内容

图1
图2

9.多条管道下载
(1)定义管道类
(2)在settings中开启管道
10.多页数据的下载
(1)定义一个基本网址和page
(2)重新调用def parse(self, response):函数------编写多页请求
(3)修改allowed_domains的范围------一半多页请求范围编写域名即可
11.爬取核心代码
python 复制代码
import scrapy
from scrapy_dangdang_095.items import ScrapyDangdang095Item

class DangSpider(scrapy.Spider):
    name = "dang"

    #如果是多页请求的话,需要调整 allowed_domains的范围------一般情况下只写域名
    allowed_domains = ["category.dangdang.com"]
    start_urls = ["https://category.dangdang.com/cp01.28.01.12.00.00.html"]
    # 第二页第三页的网址------一个网站数据结构应该是一样的
    # http://category.dangdang.com/pg2-cp01.28.01.12.00.00.html
    # http://category.dangdang.com/pg3-cp01.28.01.12.00.00.html



    #根网址
    base_url="https://category.dangdang.com/pg"
    page=1


    def parse(self, response):
        #pipelines 下载数据
        #items 定义数据结构
    #   print('检验是否有反爬机制')
    #   src=//ul[@id="component_59"]/li//img/@src
    #   alt=//ul[@id="component_59"]/li//img/@alt
    #   price=//ul[@id="component_59"]/li//p[@class="price"]/span[1]/text()
    #   共享li标签------所有的seletor对象,都可以再次调用xpath方法
    #拿数据
        li_list=response.xpath('//ul[@id="component_59"]/li')

        for li in li_list:
            #都返回的是列表
            src=li.xpath('.//img/@data-original').extract_first()
            #第一张图片和其他的图片的属性值不一样
            #第一张可以用src,其他的用data-original
            #反爬的------懒加载
            if src:
                scr=src
            else:
                src=li.xpath('.//img/@src').extract_first()

            name=li.xpath('.//img/@alt').extract_first()
            price=li.xpath('.//p[@class="price"]/span[1]/text()').extract_first()

            #导数据结构的包,使用定义的数据结构
            #from scrapy_dangdang_095.items import ScrapyDangdang095Item
            #遍历一下,得到一个对象------------------将定义的数据封装为book
            #
            book=ScrapyDangdang095Item(src=src,name=name,price=price)
            #yield就是类似return,返回一个值------------------获取一个book就将对象交给管道piplines------------------再保存
            yield book



            # 第二页第三页的网址------一个网站数据结构应该是一样的
            # http://category.dangdang.com/pg2-cp01.28.01.12.00.00.html
            # http://category.dangdang.com/pg3-cp01.28.01.12.00.00.html
            #ctrl+z暂停下载
            #ctrl+alt+l,整理json数据格式

        #多页请求代码------多页请求代码------多页请求代码------多页请求代码
        #别忘记改变allowed_domains=属性的范围------一般只写域名
        if self.page<100:
            #第一页已经爬取完毕
            #所以直接加一
            self.page=self.page+1

            #将self.page强转为字符串
            url=self.base_url+str(self.page)+'-cp01.28.01.12.00.00.html'
            #去调用parse方法
            #scrapy.Request就是scrapy的get请求
            #callback属性就是要执行哪一个函数------注意不要加括号()
            yield scrapy.Request(url=url,callback=self.parse)
相关推荐
d111111111d几秒前
再STM32F103C8T6中小端存储和大端存储有什么不同,STM32F103C8T6用的是那个,为什么要这么使用?
笔记·stm32·单片机·嵌入式硬件·学习
Chloeis Syntax2 分钟前
MySQL初阶学习日记(5)--- 联合查询
java·笔记·学习·mysql
free-elcmacom7 分钟前
机器学习进阶<7>人脸识别特征锚点Python实现
人工智能·python·机器学习·rbfn
思成不止于此8 分钟前
【MySQL 零基础入门】DQL 核心语法(三):学生表排序查询与分页查询篇
数据库·笔记·学习·mysql
天才少女爱迪生8 分钟前
图像序列预测有什么算法方案
人工智能·python·深度学习·算法
计算机学姐8 分钟前
基于Python的高校后勤报修系统【2026最新】
开发语言·vue.js·后端·python·mysql·django·flask
Q_Q196328847511 分钟前
python+django/flask+vue的智能房价分析与预测系统
spring boot·python·django·flask·node.js·php
霍金的微笑14 分钟前
三问三[特殊字符]
学习
txwtech15 分钟前
第20篇 python如何找到pyd文件的
开发语言·python
00后程序员张17 分钟前
Python 抓包工具全面解析,从网络监听、协议解析到底层数据流捕获的多层调试方案
开发语言·网络·python·ios·小程序·uni-app·iphone