使用scrapy-redis爬取豆果美食分类及详情页数据

2023-06-0917:22:04云计算与物联网Comments516 views字数 2494阅读模式

使用scrapy-redis抓取豆果美食分类,以及详情页数据文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

数据存储:MySQL文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

1. 创建项目

于终端输入指令:scrapy startproject "项目名"文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

使用命令cd进入创建项目的spiders文件目录下,scrapy+'文件名' +’爬取网站地址‘文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

2. python代码

修改USER_AGENT, 将ROBOTSTXT_OBEY的True改为False,否则无法爬取数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

使用scrapy-redis爬取豆果美食分类及详情页数据

取消ITEM_PIPELINES的注释。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

使用scrapy-redis爬取豆果美食分类及详情页数据

因为要使用redis,所以还需要添加以下设置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

#使用scrapy_redis组件自己的调度器   setting文件设置
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 确保所有spider通过redis共享相同的重复过滤。
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 可选 不清理redis队列,允许暂停/恢复抓取。 允许暂定,redis数据不丢失
SCHEDULER_PERSIST = True

# REDIS 主机和端口
REDIS_HOST = '127.0.0.1'  # 写自己电脑的ip地址
REDIS_PORT = 6379

spiders中的python文件代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

import scrapy
from ..items import TteightItem
from scrapy_redis.spiders import RedisSpider
import re

class DdouguoSpider(RedisSpider):
    name = 'ddouguo'
    allowed_domains = ['www.douguo.com']

    # start_urls = ['https://www.douguo.com/fenlei']
    redis_key = 'ddouguo:start_urls'

    # lpush ddouguo:start_urls https://www.douguo.com/fenlei

    def parse(self, response):
        # print(response.text)
        item = TteightItem()
        sub_url = re.findall('<li><a  href="(.*?)" title=".*?" target="_blank">.*?</a></li>', response.text, re.S)
        for i in sub_url:
            sub_url = 'https://www.douguo.com' + i
            # print(sub_url)
            # print(type(sub_url))
            title = sub_url.split('/')[4]
            item['title'] = title
            print(title)
            yield scrapy.Request(sub_url, meta={'item': item}, callback=self.sub_parse, dont_filter=True)

    def sub_parse(self, response):
        print(response.text)
        item = response.meta['item']
        sub_title = re.findall('<a class="cookname text-lips " href="/cookbook/.*?.html" target="_blank">(.*?)</a>',
                               response.text, re.S)
        print(sub_title)
        sub_major = re.findall('<p class="major">(.*?)</p>', response.text, re.S)
        print(sub_major)
        for sub_title, sub_major in zip(sub_title, sub_major):
            item['sub_title'] = sub_title
            item['sub_major'] = sub_major
            # print(sub_major)
            yield item

items文件代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

import scrapy


class TteightItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    sub_title = scrapy.Field()
    sub_major = scrapy.Field()

pipelines(存储数据)文件代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

import pymysql

class MysqlTteightPipeline:
    def __init__(self):
        self.dg = pymysql.connect(
            user='用户名',
            password='用户密码',
            database='数据库名称'
        )
        self.cursor = self.dg.cursor()

    def process_item(self, item, spider):
        sql = """insert into ddouguo(title, sub_title, sub_major)
        values (%s, %s, %s)"""
        try:
            self.cursor.execute(sql,(item['title'],item['sub_title'],item['sub_major']))
            self.dg.commit()
        except Exception as e:
            print('失败')

        return item

    def __del__(self):
        self.dg.close()

最好创建一个启动爬虫的文件,这样不用每次执行在终端中重复输入指令,只需点击该文件执行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

import os

os.system('scrapy crawl ddouguo')

打开redis-server.exe文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

使用scrapy-redis爬取豆果美食分类及详情页数据

成功打开后,如图:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

使用scrapy-redis爬取豆果美食分类及详情页数据

打开redis-cli.exe,成功打开后如图:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

使用scrapy-redis爬取豆果美食分类及详情页数据

运行程序后会有等待提示,于cli窗口输入指令:lpush ddouguo:start_urls https://www.douguo.com/fenlei,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

启动redis。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

成功爬取数据如下图:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html

使用scrapy-redis爬取豆果美食分类及详情页数据
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/46349.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/46349.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定