Scrapy简易爬取大众点评美食

2024-03-24 00:38

本文主要是介绍Scrapy简易爬取大众点评美食,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Scrapy简易爬取大众点评美食

  • 最近快过五一了,对于部分人来说可定是旅游出去吃吃喝喝咯,那就来个爬取美食的吧,主要还是半个多月没写与工作无关的代码了,快生疏了,再不写写估计又还回去了

  • 效果图

    总共十四列数据,包括环境、人均消费等等

  • 接下来就得开始敲代码了,使用Scrapy+Selenium方式爬取,每次爬取先打开网页,爬取完后发送信号关闭网页,为什么用网页呢,因为笔者刚开始直接用Scrapy方式爬取,设置好了IP代理池和User_Agent代理池,发现还是有404情况,也就是可能会有目标计算机积极拒绝等警告吧,然后最好的方式当然就用网页模拟咯,可以在爬虫类中设置custom_settings,里面可以写一些Cookies,当然偷个懒的话,直接网页模拟,什么都解决了

  • 看了我上篇Scrapy总结的话就知道,User_Agent代理直接用fake_useragent,代理的话,免费的话就直接爬取西刺等高匿名ip代理,然后验证一下,通过就设置,不通过直接在process_response中重新设置一下,见代码中的RandomProxyMiddlesare中间件

  • 在过程中,笔者使用了scrapy.loader下的ItemLoader和scrapy.loader.processors下的TakeFirst取第一个元素,因为使用ItemLoader的话,item_loader = PublicspiderItem(item=PubliccommentItem(), response=response),最后爬取的有些数据是None,从ItemLoader的源码可以看出,内部进行了判断,如果是None,将没有设置的字段的Key值,会报错,没办法,然后就取消了ItemLoader的使用。

  • 还需要注意的是,Selenium打开的浏览器,需要在爬虫结束时后关闭,因此就需要用到信号链了,需要使用到scrapy下的signals和scrapy.xlib.pydispatch下的dispatcher,如dispatcher.connect(self.spider_closed, signals.spider_closed),运行中会提示使用其他方法替代,这是因为高版本换了方法

  • 使用fake_useragnet设置代理池如下

  • class CustomUserAgentMiddleware(object):def __init__(self, crawler):super().__init__()self.ua = UserAgent()self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")@classmethoddef from_crawler(cls, crawler):return cls(crawler)def process_request(self, request, spider):def get_ua():return getattr(self.ua, self.ua_type)request.headers.setdefault("User_Agent", get_ua())
  •  集成browser到scrapy

  • class SeleniumScrapyMiddleware(object):def process_request(self, request, spider):if spider.name == "dazong":import timespider.browser.get(request.url)time.sleep(2)return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source,encoding="utf-8", request=request)

  • 其中setting.py中的设置

    DOWNLOADER_MIDDLEWARES = {'PublicComment.middlewares.CustomUserAgentMiddleware': 542,'PublicComment.middlewares.SeleniumScrapyMiddleware': 112,# 'PublicComment.middlewares.RandomProxyMiddlesare': 125,'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': None,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None
    }

  • 最后爬虫类代码为

    # -*- coding: utf-8 -*-
    import scrapy
    from PublicComment.items import PublicspiderItem, PubliccommentItem
    from selenium import webdriver
    from scrapy import signals
    from scrapy.xlib.pydispatch import dispatcherclass DazongSpider(scrapy.Spider):name = 'dazong'allowed_domains = ['dianping.com']start_urls = ["http://www.dianping.com/tianjin/ch10"]for i in range(2, 51):start_urls.append("http://www.dianping.com/tianjin/ch10/p{}".format(i))def __init__(self):# self.browser = webdriver.PhantomJS(executable_path="D://Program Files//Phantomjs//phantomjs-2.1.1-windows//bin\phantomjs.exe")  # executable_path=""self.browser = webdriver.Firefox()super().__init__()dispatcher.connect(self.spider_closed, signals.spider_closed)self.browser.get("http://www.dianping.com/tianjin")import timetime.sleep(2)self.browser.find_element_by_css_selector("#cata-hot > div.cata-hot-detail.cata-hot-info > div > a").click()self.browser.find_element_by_css_selector("#logo-input > div > a.city.J-city > i").click()time.sleep(10)def spider_closed(self):self.browser.quit()self.browser.close()def parse(self, response):print(response.text)lis = response.css("#shop-all-list ul li")# print(len(lis))for node in lis:name = node.css("div.tit a h4::text").extract_first()start = node.css("div.comment > span::attr(title)").extract_first()taste = node.css("div.txt span.comment-list span:nth-child(1) b::text").extract_first()environment = node.css("div.txt span.comment-list span:nth-child(2) b::text").extract_first()service = node.css("div.txt span.comment-list span:nth-child(3) b::text").extract_first()tag = node.css("div.tag-addr a:nth-child(1) span::text").extract_first()comments = node.css("div.comment a.review-num > b::text").extract_first()price = node.css("div.comment a.mean-price > b::text").extract_first()area = node.css("div.tag-addr a:nth-child(3) span::text").extract_first()address = node.css("div.tag-addr > span::text").extract_first()recommend_food = node.css("div.recommend a::text").extract()has_bulk = node.css("div.svr-info a:nth-child(1)::attr(title)").extract_first()preferential = node.css("div.svr-info a.tuan.privilege::text").extract_first()link = node.css("div.tit > div a:nth-child(1)::attr(href)").extract_first()item = PubliccommentItem()item['name'] = name if name is not None else ""item['start'] = start if start is not None else ""item['taste'] = taste if taste is not None else ""item['environment'] = environment if environment is not None else ""item['service'] = service if service is not None else ""item['tag'] = tag if tag is not None else ""item['comments'] = comments if comments is not None else ""item['price'] = price if price is not None else "暂无"item['area'] = area if area is not None else ""item['address'] = address if address is not None else ""item['recommend_food'] = "  ".join(recommend_food) if recommend_food is not None else "暂无"item['has_bulk'] = has_bulk if has_bulk is not None else "暂无"item['preferential'] = preferential if preferential is not None else "暂无"item['link'] = link if link is not None else ""yield item

最后是代码地址:传送门

这篇关于Scrapy简易爬取大众点评美食的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840022

相关文章

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

海龟绘图简易教程|Turtle for Python

turtle 是 python 内置的一个比较有趣味的模块,俗称 海龟绘图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言,之后一些很酷的 Python 程序员构建了 turtle 库,让其他程序员只需要 import turtle,就可以在 Python 中使用海龟作图。 原文链接|海龟绘图简易教程 1. 基本

使用jetty和mongodb做个简易文件系统

使用jetty和mongodb做个简易文件系统 - ciaos 时间 2014-03-09 21:21:00   博客园-所有随笔区 原文   http://www.cnblogs.com/ciaos/p/3590662.html 主题  MongoDB  Jetty  文件系统 依赖库: 1,jetty(提供http方式接口) 2,mongodb的java驱动(访问mo

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候,发现很多博客在onTimer(event: (utc: number, elapsedTime: number) => void) 这里提到elapsedTime:计时器经过的时间,单位为毫秒。我不清楚是否为版本问题。 在我查看version11和version10的api时候,说的都是设置格式的最小单位。 经过个人检验的

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情

python网络爬虫(五)——爬取天气预报

1.注册高德天气key   点击高德天气,然后按照开发者文档完成key注册;作为爬虫练习项目之一。从高德地图json数据接口获取天气,可以获取某省的所有城市天气,高德地图的这个接口还能获取县城的天气。其天气查询API服务地址为https://restapi.amap.com/v3/weather/weatherInfo?parameters,若要获取某城市的天气推荐 2.安装MongoDB

黑马点评11——UV统计-HyperLogLog

文章目录 HyperLogLog的用法测试百万数据的统计 HyperLogLog的用法 简直就是天生用于UV统计的,太爽了! 测试百万数据的统计 /*** info memory* 2107168* 插入1000000条数据后,内存的变化* 2121552*/@Testvoid testHyperLogLog(){String[] values = new Stri

黑马点评10——用户签到-BitMap数据结构

文章目录 BitMap用法签到功能签到统计 BitMap用法 其实数据库完全可以实现签到功能 但签到数据比较大,借鉴签到卡的思想 布隆过滤器也是使用BitMap实现的. 签到功能 因为是当前用户的当天,所以保存需要的年月日不需要参数,可以直接获取。 @Overridepublic Result sign() {// 1. 获取当前登录用户Long userId

美食|基于SpringBoot+vue的美食网站(源码+数据库+文档)

美食网站 基于SSM+vue的美食网站 一、前言 二、系统设计 三、系统功能设计  系统功能实现 后台模块实现 管理员模块实现 用户模块实现 餐厅模块实现 四、数据库设计  五、核心代码  六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于