Python爬虫---Scrapy框架---CrawlSpider

CrawlSpider

  1. CrawlSpider继承自scrapy.Spider

  2. CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发送请求,所以,如果有需要跟进链接的需求,意思就是爬取了网页之后,需要提取链接再次爬取,使用Crawlspider是非常合适的

使用scrapy shell提取:

  1. 在命令提示符中输入: scrapy shell https://www.dushu.com/lianzai/1115.html
  1. 导入链接提取器:from scrapy.linkextractors import LinkExtractor
  1. allow = () :正则表达式 ,提取符合正则的链接
  1. 查看连接提取器提取的内容
  1. restrict_xpaths = () :xpath语法,提取符合xpath规则的链接

查看提取的内容:

  1. restrict_css = () :提取符合选择器规则的链接

小案例:

  1. 创建项目:scrapy startproject 项目名

  2. 跳转到spider目录下: cd .\项目名\项目名\spiders\

  3. 创建爬虫类:scrapy genspider -t crawl 爬虫文件名 要爬取的网页 (这里与之前的不一样)

  4. 运行:scrapy crawl 爬虫文件名

指定日志等级:(settings.py文件中)
LOG_LEVEL = " DEBUG"

将日志保存在文件中: .log(settings.py文件中)
LOG_FILE = "logdemo.log"

复制代码
callback只能写函数字符串
follow=true 是否跟进 就是按照提取连接规则进行提取

爬虫文件:

python 复制代码
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_readbook_20240120.items import ScrapyReadbook20240120Item


class RbookSpider(CrawlSpider):
    name = "rbook"
    allowed_domains = ["www.dushu.com"]
    start_urls = ["https://www.dushu.com/lianzai/1115_1.html"]

    rules = (Rule(LinkExtractor(allow=r"/lianzai/1115_\d+.html"),
                  callback="parse_item",
                  follow=False),
             )

    def parse_item(self, response):
        print("++++++++++++++++++++")
        img_list = response.xpath("//div[@class='bookslist']//img")

        for img in img_list:
            src = img.xpath("./@data-original").extract_first()
            name = img.xpath("./@alt").extract_first()
            book = ScrapyReadbook20240120Item(name=name, src=src)
            yield book

pipelines.py文件

python 复制代码
class ScrapyReadbook20240120Pipeline:

    def open_spider(self, spider):
        self.fp = open("book.json", "w", encoding="utf-8")

    def process_item(self, item, spider):
        self.fp.write(str(item))
        return item

    def close_spider(self, spider):
        self.fp.close()

items.py文件

python 复制代码
import scrapy

class ScrapyReadbook20240120Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    src = scrapy.Field()

settings.py文件

python 复制代码
# 开启管道
ITEM_PIPELINES = {
   "scrapy_readbook_20240120.pipelines.ScrapyReadbook20240120Pipeline": 300,
}

保存在数据库中:

  1. 创建数据库

create database 数据库名字 charset utf8;

  1. 使用数据库

use 数据库名字;

  1. 创建表格 :例子

create table 表名(

id int primary key auto_increment,

name varchar(128),

src varchar(128)

);

  1. 在settings.py 文件中添加 ip地址、端口号、数据库密码、数据库名字、字符集

DB_HOST = "localhost" # ip地址

DB_PORT = 3306 # 端口号,必须是整数

DB_USER = "root" # 数据库用户名

DB_PASSWORD = "123456" # 数据库密码

DB_NAME = "rbook" # 数据库名字

DB_CHARSET = "utf8" # 字符集,不允许写 -

  1. 在pipelines管道文件中增加
python 复制代码
# 加载settings文件
from scrapy.utils.project import get_project_settings
import pymysql


class MysqlPipeline:
    def open_spider(self, spider):
        settings = get_project_settings()
        self.host = settings["DB_HOST"]  # ip地址
        self.port = settings["DB_PORT"]  # 端口号
        self.user = settings["DB_USER"]  # 数据库用户名
        self.password = settings["DB_PASSWORD"]  # 数据库密码
        self.name = settings["DB_NAME"]  # 数据库名字
        self.charset = settings["DB_CHARSET"]  # 字符集

        self.connect()

    def connect(self):
        self.conn = pymysql.connect(
            host=self.host,
            port=self.port,
            user=self.user,
            password=self.password,
            db=self.name,
            charset=self.charset
        )
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        sql = "insert into rbook(name,src) values('{}','{}')".format(item["name"], item["src"])
        # 执行sql语句
        self.cursor.execute(sql)
        # 提交sql语句
        self.conn.commit()

        return item

    def close_spider(self, spider):
        # 关闭数据库链接
        self.cursor.close()
        self.conn.close()
  1. settings文件:添加新的管道
python 复制代码
ITEM_PIPELINES = {
   "scrapy_readbook_20240120.pipelines.ScrapyReadbook20240120Pipeline": 300,
   "scrapy_readbook_20240120.pipelines.MysqlPipeline": 301,
}
  1. 若要一直下载,把所有数据都下载,则需要把爬虫文件里的follow 的值设为 True

数据库的数据:

相关推荐
TechWayfarer6 小时前
查询IP所在地的3种方案:从API到离线库,风控场景怎么选?
开发语言·网络·python·网络协议·tcp/ip
程序员榴莲6 小时前
Python 单例模式
开发语言·python·单例模式
hh.h.7 小时前
昇腾CANN ops-transformer 仓的 MC2 算子:MoE 模型的全到全通信
python·深度学习·transformer·cann
NiceCloud喜云8 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书
专注VB编程开发20年8 小时前
windows下python自带标准库 ≈ 70% 纯.py 源码,30% .pyd(DLL)
python
萌新小码农‍8 小时前
人工智能数学基础+python实例(人工智能学习day3)
开发语言·人工智能·python
毋语天10 小时前
FastAPI 进阶实战:请求体、文件上传、响应模型与数据校验
python·fastapi·api开发·数据校验·pydantic
ZhengEnCi11 小时前
09a-斯坦福 CS336 作业一:BPE 分词器
python·神经网络
测试员周周11 小时前
【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
人工智能·python·功能测试·ui·单元测试·appium·测试用例