使用scrapy-redis爬取豆果美食分类及详情页数据
使用scrapy-redis抓取豆果美食分类,以及详情页数据
数据存储:MySQL
1. 创建项目
于终端输入指令:scrapy startproject "项目名"
使用命令cd进入创建项目的spiders文件目录下,scrapy+'文件名' +’爬取网站地址‘
2. python代码
修改USER_AGENT, 将ROBOTSTXT_OBEY的True改为False,否则无法爬取数据。

取消ITEM_PIPELINES的注释。

因为要使用redis,所以还需要添加以下设置
#使用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文件代码如下:
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文件代码如下:
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(存储数据)文件代码如下:
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()
最好创建一个启动爬虫的文件,这样不用每次执行在终端中重复输入指令,只需点击该文件执行。
import os
os.system('scrapy crawl ddouguo')
打开redis-server.exe

成功打开后,如图:

打开redis-cli.exe,成功打开后如图:

运行程序后会有等待提示,于cli窗口输入指令:lpush ddouguo:start_urls https://www.douguo.com/fenlei,
启动redis。
成功爬取数据如下图:

THE END