scrapy实战

免责声明

        本文的爬虫知识仅用于合法和合理的数据收集,使用者需遵守相关法律法规及目标网站的爬取规则,尊重数据隐私,合理设置访问频率,不得用于非法目的或侵犯他人权益。因使用网络爬虫产生的任何法律纠纷或损失,由使用者自行承担风险和责任。

1、Scrapy保存数据到数据库

概述:下面通过一个完整的案例让大家了解Scrapy如何将数据保存到不同的数据库。

1.1、获取数据

1.1.1.创建项目和爬虫文件

1.1.2.编写爬虫文件

import scrapy
import json

class SsqSpider(scrapy.Spider):
    name = "ssq"
    allowed_domains = ["gov.cn"]
    start_urls = ["https://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&pageNo=1&pageSize=30&systemType=PC"]

    def parse(self, response):
        datas = json.loads(response.text)
        # 获取所有的数据列表
        for data in datas.get("result"):
            # 期号 红球 蓝球
            print(data.get("code"),'===',data.get("red"),'===',data.get("blue"))

1.1.3、修改配置文件

# 添加请求头
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
    'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
    'scrapy_fake_useragent.middleware.RetryUserAgentMiddleware': 401,
}

# 配置 UserAgent 类型
FAKEUSERAGENT_PROVIDERS = [
    'scrapy_fake_useragent.providers.FakeUserAgentProvider',  # 第一选择
    'scrapy_fake_useragent.providers.FakerProvider',  # 第二选择
    'scrapy_fake_useragent.providers.FixedUserAgentProvider',  # 第三选择
]

# 关闭爬虫规则
# ROBOTSTXT_OBEY = True

1.1.3、创建并编辑启动脚本

在scrapy09项目下创建启动脚本begin:

from scrapy.cmdline import execute
execute(["scrapy","crawl","ssq"])

运行启动脚本,结果如下:


1.2、将数据保存到mongo

概述:将前面获取到的数据返回给引擎,引擎再交给pipeline,pipeline再将获取的数据保存到指定数据库中。

1.2.1、修改爬虫文件

import scrapy
import json

class SsqSpider(scrapy.Spider):
    name = "ssq"
    allowed_domains = ["gov.cn"]
    start_urls = ["https://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice?name=ssq&pageNo=1&pageSize=30&systemType=PC"]

    def parse(self, response):
        datas = json.loads(response.text)
        # 获取所有的数据列表
        for data in datas.get("result"):
            # 将获取的数据传递给引擎
            yield {
                "code":data.get("code"), # 期号
                "red":data.get("red"), # 红球
                "blue":data.get("blue") # 蓝球
            }

1.2.2、修改Pipeline文件

import pymongo

class MongoPipeline:
    def open_spider(self):
        # 获取客户端链接
        self.client = pymongo.MongoClient()
        # 通过客户端获取数据库实例,再通过数据库实例获取指定的集合
        self.ssq = self.client.myssq_data.ssq

    def process_item(self, item, spider):
        # 将引擎传过来的数据写入mongo数据库
        self.ssq.insert_one(item)
        return item

    def close_spider(self):
        self.client.close()

1.2.3、编辑配置文件

# 主要是开启ITEM_PIPELINES,注意将pipeline修改成自己的pipeline名称
ITEM_PIPELINES = {
   "scrapy09.pipelines.MongoPipeline": 300,
}

1.2.4、运行爬虫文件

注意:运行前一定要提前开启mongo,否则Pycharm将无法连接到mongo。

运行启动脚本后,通过图形管理工具Robo  3T查看mongo数据库中的数据如下,由此可知已将获取的数据正确的保存到了mongo数据库中:


1.3、将数据保存到MySql

注意:以下操作都是在1.2的基础上进行,如果跳过了上面的内容无法实现的可以查看是否少了上面的某些操作。

1.3.1、操作前准备

首先下载pymysql(在终端中运行如下代码):

pip install pymysql

然后去自己的mysql数据库创建一个名为ssq的数据库,并进入ssq数据库创建一个名为ssq_table的表,以下是ssq_table的表结构(以上名字都是可以改的,只是修改后代码也许做出对应的调整):

1.3.2、编写Pipeline文件

概述:在1.1小节中就以及将数据获取了,本节只需编写Pipeline文件将数据存储到mysql即可。

import pymysql
class MysqlPipeline:
    # 创建链接
    def open_spider(self,spider):
        # 获取客户端连接(要提前在mysql中创建一个名为ssq的数据库)
        self.client = pymysql.connect(host="localhost",port=3306,user="root",password="123456",db="ssq",charset="utf8")
        # 获取游标对象
        self.cursor = self.client.cursor()

    def process_item(self, item, spider):
        # 向表中插入数据的sql语句(ssq_table这个表也要提前创建)
        sql = "insert into ssq_table (id,code,red,blue) values (0,%s,%s,%s)"
        # 对应sql中要传入的参数
        args = (item['code'],item['red'],item['blue'])
        # 执行sql语
### Scrapy框架实战教程 Scrapy 是一个用于抓取网页并提取结构化数据的强大框架。以下是有关如何构建基于 Scrapy项目的详细说明。 #### 创建新的Scrapy项目 通过运行 `scrapy startproject` 命令可以初始化一个新的Scrapy项目[^2]。例如: ```bash scrapy startproject used_car_project ``` 此命令会生成标准的Scrapy项目结构,其中包括多个重要组件,如爬虫目录、中间件、管道以及配置文件等[^1]。 #### 项目结构详解 创建后的项目通常具有以下结构[^3]: - **myproject/**: 主要存储项目的核心代码。 - **__init__.py**: 初始化脚本。 - **items.py**: 定义数据项的数据模型。 - **middlewares.py**: 自定义请求或响应处理逻辑的地方。 - **pipelines.py**: 处理已抓取到的数据的位置。 - **settings.py**: 设置全局参数,比如下载延迟、并发数等。 - **spiders/**: 放置具体实现各个功能的爬虫类。 - **scrapy.cfg**: 配置整个项目的启动选项和其他元信息。 #### 编写第一个爬虫 在实际操作中,开发者需要进入 `spiders/` 文件夹下新建 Python 脚本来开发具体的爬虫程序。每一个独立的任务都可以封装成单独的一个 Spider 类实例。 对于二手车网站这样的场景来说,可能涉及多页翻阅或者复杂页面解析的情况,则可以通过继承官方提供的 CrawlSpider 或其他高级基类来简化工作流程。 另外,在某些情况下还需要自定义 Items 来保存所需字段的信息。下面是一个简单的例子展示如何声明这些属性[^4]: ```python import scrapy class UsedCarItem(scrapy.Item): name = scrapy.Field() price = scrapy.Field() mileage = scrapy.Field() ``` 以上片段展示了怎样利用 Field 方法为每辆车记录名称(name)、价格(price) 和行驶里程(mileage)。 最后一步就是设置好 Pipelines 将清洗过的资料储存至数据库或者其他形式的目标位置上去了! #### 示例代码总结 综合上述各部分内容之后得到完整的解决方案应该像这样子: ```python # Define the item structure. import scrapy class CarInfo(scrapy.Item): brand = scrapy.Field() # Brand of car (e.g., Toyota). model = scrapy.Field() # Model type (e.g., Corolla). year = scrapy.Field() # Year manufactured. # Implement spider logic here... from scrapy.spiders import Spider class ExampleSpider(Spider): name = 'example' allowed_domains = ['www.example.com'] start_urls = ['http://www.example.com/cars'] def parse(self, response): cars_listings = response.css('div.listing') for listing in cars_listings: yield { 'brand': listing.css('.make::text').get(), 'model': listing.css('.model::text').get(), 'year': int(listing.css('.year::text').re_first(r'\d{4}')) } next_page_url = response.css('a.next-page-link::attr(href)').extract_first() if next_page_url is not None: yield response.follow(next_page_url, self.parse) # Configure data processing pipeline inside pipelines.py file accordingly. def process_item(item, spider): ... return item ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐曦可期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值