CrawlSpider爬取聚美优品之翻页(MongoDB)

自从学习了上个案例(CrawlSpider爬虫之爬取17k小说网列表详情及章节并放在一起(CrawlSpider翻页、MongoDB)-优快云博客),做这个就简单多了,视频教程里也很简单,毕竟是入门CrawlSpider的实战小demo。这个视频教程真的做的很贴心。

聚美优品上打不开兰蔻品牌的链接啊,显示404啊。是不是爬崩溃了😄……

选择雅诗兰黛这个品牌,而且需要在其他页面,才能选择下拉菜单,看把人家聚美优品折腾的,首页都不敢放下拉菜单了~~~~

废话不多说,我忒忙……上代码

app.py

from typing import Iterable

import scrapy
from scrapy import Request
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ..items import jumei_product


class AppSpider(CrawlSpider):
    name = "app"
    start_urls = [
        "http://search.jumei.com/?filter=0-11-1&search=%E9%9B%85%E8%AF%97%E5%85%B0%E9%BB%9B&bid=4&site=sh"]

    rules = (
        Rule(LinkExtractor(allow=r"http://item.jumeiglobal.com/(.+).html",
                           restrict_xpaths=('//div[@class="s_l_pic"]/a')),
             callback="parse_detail", follow=False, process_links="process_detail"),
    )

    def start_requests(self) -> Iterable[Request]:
        max_page = 4
        for i in range(1, max_page):
            url = "http://search.jumei.com/?filter=0-11-" + str(
                i) + "&search=%E9%9B%85%E8%AF%97%E5%85%B0%E9%BB%9B&bid=4&site=sh"
            yield Request(url)

    def process_detail(self, links):
        for index, link in enumerate(links):
            # 列表页,每页选5个商品
            if index < 5:
                yield link
            else:
                return

    def parse_detail(self, response):
        # 商品详情数据信息
        title = response.xpath('//div[@class="deal_con_content"]//tr[1]/td[2]/span/text()').get()
        category = response.xpath('//div[@class="deal_con_content"]//tr[4]/td[2]/span/text()').get()
        address = response.xpath('//div[@class="deal_con_content"]//tr[6]/td[2]/span/text()').get()
        expired = response.xpath('//div[@class="deal_con_content"]//tr[8]/td[2]/span/text()').get()

        item = jumei_product()
        item["title"] = title
        item["category"] = category
        item["address"] = address
        item["expired"] = expired
        yield item


列表页选择5个商品,选择循环3个列表页面。

items.py

import scrapy


class jumei_product(scrapy.Item):
    title = scrapy.Field()
    category = scrapy.Field()
    address = scrapy.Field()
    expired = scrapy.Field()

数据库实体类pipelines.py

import pymongo


class Scrapy02Pipeline:
    def __init__(self):
        print("-" * 10, "开始", "-" * 10)
        self.res = None
        self.client = pymongo.MongoClient("mongodb://localhost:27017")
        self.db = self.client["jumei"]
        self.collection = self.db["landai"]
        self.collection.delete_many({})

    def process_item(self, item, spider):
        self.res = self.collection.insert_one(dict(item))
        # print(self.res.inserted_id)
        return item

    def __del__(self):
        print("-" * 10, "结束", "-" * 10)

是不是感觉有手就行了?😄

学无止境,学到后期,不仅仅是有手就行,要做到无手自行才行吧……

### Scrapy爬取数据并存储到MongoDB数据库中的实现 在Scrapy中将爬取的数据存储到MongoDB数据库中,需要结合`pymongo`库与Scrapy的管道机制(Item Pipeline)。通过定义一个自定义的Pipeline类,可以在数据爬取完成后将其插入到MongoDB中。以下是完整的实现步骤和代码示例。 #### 1. 确保依赖安装 首先,确保已经安装了必要的Python包: - `scrapy`:用于构建网络爬虫。 - `pymongo`:用于连接和操作MongoDB数据库。 可以通过以下命令安装这些依赖[^2]: ```bash pip install scrapy pymongo ``` #### 2. 创建Scrapy项目 如果尚未创建Scrapy项目,可以使用以下命令初始化一个新的项目: ```bash scrapy startproject lianjia ``` 接着生成一个爬虫文件: ```bash scrapy genspider -t crawl lianjiahouse lianjia.com ``` #### 3. 定义Item结构 在`items.py`文件中定义目标数据字段,例如链家二手房房源信息: ```python import scrapy class LianjiaItem(scrapy.Item): title = scrapy.Field() # 房源标题 price = scrapy.Field() # 房源价格 area = scrapy.Field() # 房屋面积 location = scrapy.Field() # 房屋位置 detail_url = scrapy.Field() # 房源详情页链接 ``` #### 4. 编写爬虫逻辑 在`spiders/lianjiahouse.py`文件中编写具体的爬虫逻辑,提取所需数据字段,并传递给Item对象。 #### 5. 配置MongoDB连接 在项目的`settings.py`文件中添加MongoDB的连接配置: ```python MONGO_URI = 'mongodb://localhost:27017/' MONGO_DATABASE = 'lianjia' ``` #### 6. 实现MongoDB存储管道 在`pipelines.py`文件中编写一个自定义的Pipeline类,用于将数据存储到MongoDB中: ```python from pymongo import MongoClient from scrapy.exceptions import DropItem class MongoDBPipeline: def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): collection_name = spider.name if self.db[collection_name].insert_one(dict(item)): return item else: raise DropItem("Failed to insert item into MongoDB") ``` #### 7. 启用Pipeline 在`settings.py`文件中启用MongoDBPipeline: ```python ITEM_PIPELINES = { 'lianjia.pipelines.MongoDBPipeline': 300, } ``` #### 8. 运行爬虫 最后,启动爬虫并将数据存储到MongoDB中: ```bash scrapy crawl lianjiahouse ``` ### 总结 通过以上步骤,可以将Scrapy爬取的数据高效地存储到MongoDB数据库中。整个流程包括环境准备、项目创建、数据定义、爬虫逻辑编写、MongoDB连接配置以及自定义Pipeline的实现。该方法不仅适用于链家二手房数据抓取,也适用于其他类似的Web Scraping任务。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

andux

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

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

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

打赏作者

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

抵扣说明:

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

余额充值