pyspider爬取外卖信息求高手指导

发布于 2022-09-03 12:57:07 字数 1404 浏览 18 评论 0

准备9月份开学给学生们讲一下爬虫,激发学生的学习兴趣。比较pyspider、Pholcus、WebCollector等开源爬虫框架,最后还是选择pyspider来制作演示例子,因为不用编译、框架强大、编码直观。但是困难也是显而易见的,没接触过python语法和库都不熟,html也是10年前的认知ajax、json等只知道原理没开发经验。这几日都在看帖子重新摸索。
环境搭建上尝试了几日发现windows下使用python2.7.12 32位版运行pyspider最稳定。css选择器和webDAV都能正常使用。
环境搭建方法:安装python2.7.12 32位版;安装anaconda2 4.1.1 32位版;phantomjs-2.1.1解压后phantomjs.exe拷贝到anaconda下的script目录。下载lxml-3.6.2-cp27-cp27m-win32.whl在pip下安装,顺利用pip安装pyspider
爬取的目标是美团外卖各店的外卖菜名、价格及销量。通过浏览器访问美团外卖,输入地址就可以罗列出周边外卖店,点击一家外卖店就罗列出菜名、价格和销量。爬取起始链接输入地名定位后得到的链接

外卖店的链接http://waimai.meituan.com/res...

下面说说问题:
on_star 爬取起始链接发现只加载20条数据,每次滚动条拖到页底触发ajax多加载20条。点击按销量排序也触发ajax ajax地址 方法post 使用cookie提交参数。 我想这样设计先GET请求一次起始链接,获得cookie后模拟ajax post请求一次按销量排序,再多次请求ajax加载更多店面。这里该怎么写?response.cookie 没找到例子

爬取店内菜品、价格和销量 DIV的class名称不一致,怎么才能迭代?
菜名第三列和一、二的属性不一致

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

巴黎夜雨 2022-09-10 12:57:07

推荐给你,使用fiddler这个工具,先启动这个工具,再在浏览器中输入网址,这个时候,会记录下HTTP交互的内容,这里发送的内容就是你的输入参数,而返回的数据,就是你要解析的数据。

—━☆沉默づ 2022-09-10 12:57:07

研究了两天,写出来了,基础知识薄弱就是纠结。但是这个程序里全局变量OFFSET作用域不对,list_page调用自身的时候OFFSET居然重新为1了,百撕不得骑姐。还有爬虫获取的商铺列表和浏览器看到的列表不一样。也不知道具体原因。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2016-08-19 15:49:13
# Project: waimai

from pyspider.libs.base_handler import *
import re


class Handler(BaseHandler):
    global OFFSET
    OFFSET = 1
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('http://waimai.meituan.com/geo/geohash?lat=22.822138834744692&lng=108.37628871202469&addr=%25E5%259C%25B0%25E7%258E%258B%25E5%259B%25BD%25E9%2599%2585%25E5%2595%2586%25E4%25BC%259A&from=m',  callback=self.index_page)
        
    @config(age=0)
    def index_page(self, response):
        self.crawl('http://waimai.meituan.com/ajax/poilist', method='POST', headers={'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'zh-CN,zh;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Referer': 'http://waimai.meituan.com/home/wkj1f4thwe41', 'Origin': 'http://waimai.meituan.com'}, data={'classify_type': 'cate_all', 'sort_type': '1', 'price_type': '0', 'support_online_pay': '0', 'support_invoice': '0', 'support_logistic': '0', 'page_offset': '1', 'page_size': '20'}, cookies=response.cookies, callback=self.list_page)
        
    @config(age=0)
    def list_page(self, response):
        global OFFSET
        if response.json['code'] == 0:
            for x in response.json['data']['poiList']:
                self.crawl('http://waimai.meituan.com/restaurant/'+ str(x['wmPoi4Web']['wm_poi_id']), callback=self.detail_page)
                OFFSET = OFFSET + 1
            if response.json['data']['hasMore']:
                self.crawl('http://waimai.meituan.com/ajax/poilist', method='POST', headers={'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'zh-CN,zh;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Referer': 'http://waimai.meituan.com/home/wkj1f4thwe41', 'Origin': 'http://waimai.meituan.com'}, data={'classify_type': 'cate_all', 'sort_type': '1', 'price_type': '0', 'support_online_pay': '0', 'support_invoice': '0', 'support_logistic': '0', 'page_offset': str(OFFSET), 'page_size': '20'}, cookies=response.cookies, callback=self.list_page)
            else:
                for x in response.json['data']['poiList']:
                    self.crawl('http://waimai.meituan.com/restaurant/'+ str(x['wmPoi4Web']['wm_poi_id']), callback=self.detail_page)
        else:
            return [response.json['msg']]
        
    @config(age=0)
    def detail_page(self, response):
        return {
            "url": response.url,
            "店名": response.doc('html > body > div.wrapper > div.page-wrap > div > div.rest-info > div.details > div.up-wrap > div.list > div.na > a > span').text(),
            "地址": [x.text() for x in response.doc('span.fl.info-detail').items()],
            "销量": [{"菜品": x('div.np.clearfix > span').text(), "月销量": x('div.sale-info.clearfix > div.sold-count.ct-lightgrey > span').text(), "价格": x('div.labels.clearfix > div > div').text(),} for x in response.doc('div.j-pic-food.pic-food').items()]
        }

输出结果:
{'url': 'http://waimai.meituan.com/res...',
'店名': u'天福香(埌西店)',
'地址': [u'南宁市金洲路埌西二组13栋9号',

                 '07715515258',
                 '09:00-23:59'],

'销量': [{'价格': u'¥14/2两',

                        '月销量': u'月售83份',
                        '菜品': u'老友猪至尊粉'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售70份',
                        '菜品': u'特价.老友猪三脆粉'},
                       {'价格': u'¥15/3两',
                        '月销量': u'月售23份',
                        '菜品': u'老友至尊粉3两'},
                       {'价格': u'¥14/份',
                        '月销量': u'月售29份',
                        '菜品': u'老友猪至尊面'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售50份',
                        '菜品': u'老友猪三脆粉'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售244份',
                        '菜品': u'招牌老友花肠猪肚粉'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售24份',
                        '菜品': u'老友碎肉粉'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售180份',
                        '菜品': u'老友猪肉粉'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售177份',
                        '菜品': u'老友猪杂粉'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售291份',
                        '菜品': u'老友牛肉粉'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售40份',
                        '菜品': u'老友牛杂粉'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售63份',
                        '菜品': u'老友八珍粉'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售27份',
                        '菜品': u'老友花肠猪肚干捞粉'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售7份',
                        '菜品': u'老友碎肉干捞粉'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售14份',
                        '菜品': u'老友牛肉干捞粉'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售3份',
                        '菜品': u'花肠猪肚粉'},
                       {'价格': u'¥6/份',
                        '月销量': u'月售5份',
                        '菜品': u'碎肉粉'},
                       {'价格': u'¥6/份',
                        '月销量': u'月售18份',
                        '菜品': u'猪肉粉'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售15份',
                        '菜品': u'猪杂粉'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售17份',
                        '菜品': u'牛肉粉'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售4份',
                        '菜品': u'牛杂粉'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售15份',
                        '菜品': u'八珍粉'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售9份',
                        '菜品': u'老友猪肉面'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售9份',
                        '菜品': u'老友猪杂面'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售8份',
                        '菜品': u'老友牛肉面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售3份',
                        '菜品': u'老友牛杂面'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售8份',
                        '菜品': u'老友八珍面'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售2份',
                        '菜品': u'老友碎肉干捞面'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售2份',
                        '菜品': u'老友猪肉干捞面'},
                       {'价格': u'¥8/份',
                        '月销量': '',
                        '菜品': u'老友猪杂干捞面'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售2份',
                        '菜品': u'老友牛肉干捞面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售2份',
                        '菜品': u'老友牛杂干捞面'},
                       {'价格': u'¥6/份',
                        '月销量': '',
                        '菜品': u'碎肉面'},
                       {'价格': u'¥6/份',
                        '月销量': u'月售2份',
                        '菜品': u'猪肉面'},
                       {'价格': u'¥7/份',
                        '月销量': '',
                        '菜品': u'猪杂面'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售10份',
                        '菜品': u'牛肉面'},
                       {'价格': u'¥8/份',
                        '月销量': '',
                        '菜品': u'牛杂面'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售6份',
                        '菜品': u'八珍面'},
                       {'价格': u'¥8/份',
                        '月销量': '',
                        '菜品': u'(甜酸)干捞粉'},
                       {'价格': u'¥8/份',
                        '月销量': '',
                        '菜品': u'(甜酸)干捞面'},
                       {'价格': u'¥2/份',
                        '月销量': u'月售79份',
                        '菜品': u'加酸笋'},
                       {'价格': u'¥6/份',
                        '月销量': u'月售21份',
                        '菜品': u'猪金钱'},
                       {'价格': u'¥6/份',
                        '月销量': u'月售40份',
                        '菜品': u'猪天梯'},
                       {'价格': u'¥1.5/份',
                        '月销量': u'月售375份',
                        '菜品': u'青菜'},
                       {'价格': u'¥1.5/份',
                        '月销量': u'月售662份',
                        '菜品': u'豆芽'},
                       {'价格': u'¥1.5/个',
                        '月销量': u'月售114份',
                        '菜品': u'生鸡蛋'},
                       {'价格': u'¥2/份',
                        '月销量': u'月售211份',
                        '菜品': u'鹌鹑蛋'},
                       {'价格': u'¥5/份',
                        '月销量': u'月售39份',
                        '菜品': u'牛百叶'},
                       {'价格': u'¥2/份',
                        '月销量': u'月售62份',
                        '菜品': u'油条'},
                       {'价格': u'¥2/个',
                        '月销量': u'月售237份',
                        '菜品': u'煎蛋'},
                       {'价格': u'¥4/份',
                        '月销量': u'月售31份',
                        '菜品': u'碎肉'},
                       {'价格': u'¥4/份',
                        '月销量': u'月售46份',
                        '菜品': u'猪肉'},
                       {'价格': u'¥5/份',
                        '月销量': u'月售151份',
                        '菜品': u'牛肉'},
                       {'价格': u'¥6/份',
                        '月销量': u'月售41份',
                        '菜品': u'牛杂'},
                       {'价格': u'¥5/份',
                        '月销量': u'月售85份',
                        '菜品': u'花肠'},
                       {'价格': u'¥5/份',
                        '月销量': u'月售37份',
                        '菜品': u'猪杂'},
                       {'价格': u'¥5/份',
                        '月销量': u'月售35份',
                        '菜品': u'猪肝'},
                       {'价格': u'¥5/份',
                        '月销量': u'月售53份',
                        '菜品': u'粉肠'},
                       {'价格': u'¥6/份',
                        '月销量': u'月售21份',
                        '菜品': u'猪肚'},
                       {'价格': u'¥2/个',
                        '月销量': u'月售58份',
                        '菜品': u'卤蛋'},
                       {'价格': u'¥5/份',
                        '月销量': '',
                        '菜品': u'叉烧'},
                       {'价格': u'¥21/份',
                        '月销量': u'月售11份',
                        '菜品': u'老友猪至尊炒伊面'},
                       {'价格': u'¥17/份',
                        '月销量': u'月售4份',
                        '菜品': u'老友猪三脆炒伊面'},
                       {'价格': u'¥20/份',
                        '月销量': '',
                        '菜品': u'猪至尊炒伊面'},
                       {'价格': u'¥16/份',
                        '月销量': '',
                        '菜品': u'猪三脆炒伊面'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售12份',
                        '菜品': u'老友猪三脆伊面'},
                       {'价格': u'¥15/份',
                        '月销量': u'月售42份',
                        '菜品': u'老友猪至尊伊面'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售32份',
                        '菜品': u'老友花肠猪肚伊面'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售9份',
                        '菜品': u'老友碎肉伊面'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售24份',
                        '菜品': u'老友猪肉伊面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售41份',
                        '菜品': u'老友猪杂伊面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售54份',
                        '菜品': u'老友牛肉伊面'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售12份',
                        '菜品': u'老友牛杂伊面'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售13份',
                        '菜品': u'老友八珍伊面'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售1份',
                        '菜品': u'老友花肠猪肚干捞伊\n    ...'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售1份',
                        '菜品': u'老友碎肉干捞伊面'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售2份',
                        '菜品': u'老友猪肉干捞伊面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售1份',
                        '菜品': u'老友猪杂干捞伊面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售5份',
                        '菜品': u'老友牛肉干捞伊面'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售1份',
                        '菜品': u'老友牛杂干捞伊面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售2份',
                        '菜品': u'花肠猪肚伊面'},
                       {'价格': u'¥7/份',
                        '月销量': '',
                        '菜品': u'碎肉伊面'},
                       {'价格': u'¥7/份',
                        '月销量': u'月售6份',
                        '菜品': u'猪肉伊面'},
                       {'价格': u'¥8/份',
                        '月销量': '',
                        '菜品': u'猪杂伊面'},
                       {'价格': u'¥8/份',
                        '月销量': u'月售1份',
                        '菜品': u'牛肉伊面'},
                       {'价格': u'¥9/份',
                        '月销量': u'月售2份',
                        '菜品': u'牛杂伊面'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售11份',
                        '菜品': u'八珍伊面'},
                       {'价格': u'¥2/份',
                        '月销量': '',
                        '菜品': u'加伊面'},
                       {'价格': u'¥20/份',
                        '月销量': u'月售47份',
                        '菜品': u'老友猪至尊炒粉'},
                       {'价格': u'¥20/份',
                        '月销量': u'月售8份',
                        '菜品': u'老友猪至尊炒面'},
                       {'价格': u'¥16/份',
                        '月销量': u'月售29份',
                        '菜品': u'老友猪三脆炒粉'},
                       {'价格': u'¥16/份',
                        '月销量': u'月售4份',
                        '菜品': u'老友猪三脆炒面'},
                       {'价格': u'¥19/份',
                        '月销量': u'月售5份',
                        '菜品': u'猪至尊炒粉'},
                       {'价格': u'¥15/份',
                        '月销量': u'月售11份',
                        '菜品': u'猪三脆炒粉'},
                       {'价格': u'¥19/份',
                        '月销量': '',
                        '菜品': u'猪至尊炒面'},
                       {'价格': u'¥15/份',
                        '月销量': u'月售5份',
                        '菜品': u'猪三脆炒面'},
                       {'价格': u'¥13/份',
                        '月销量': u'月售27份',
                        '菜品': u'老友花肠猪肚炒粉'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售62份',
                        '菜品': u'老友猪肉炒粉'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售60份',
                        '菜品': u'老友猪杂炒粉'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售103份',
                        '菜品': u'老友牛肉炒粉'},
                       {'价格': u'¥13/份',
                        '月销量': u'月售16份',
                        '菜品': u'老友牛杂炒粉'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售19份',
                        '菜品': u'猪肉炒粉'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售18份',
                        '菜品': u'猪杂炒粉'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售17份',
                        '菜品': u'牛肉炒粉'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售6份',
                        '菜品': u'牛杂炒粉'},
                       {'价格': u'¥13/份',
                        '月销量': u'月售5份',
                        '菜品': u'老友花肠猪肚炒面'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售6份',
                        '菜品': u'老友猪肉炒面'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售2份',
                        '菜品': u'老友猪杂炒面'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售13份',
                        '菜品': u'老友牛肉炒面'},
                       {'价格': u'¥13/份',
                        '月销量': u'月售4份',
                        '菜品': u'老友牛杂炒面'},
                       {'价格': u'¥10/份',
                        '月销量': u'月售4份',
                        '菜品': u'猪肉炒面'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售4份',
                        '菜品': u'猪杂炒面'},
                       {'价格': u'¥11/份',
                        '月销量': u'月售9份',
                        '菜品': u'牛肉炒面'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售3份',
                        '菜品': u'牛杂炒面'},
                       {'价格': u'¥14/份',
                        '月销量': u'月售2份',
                        '菜品': u'老友牛杂炒伊面'},
                       {'价格': u'¥13/份',
                        '月销量': u'月售3份',
                        '菜品': u'花肠猪肚炒伊面'},
                       {'价格': u'¥11/份',
                        '月销量': '',
                        '菜品': u'猪肉炒伊面'},
                       {'价格': u'¥12/份',
                        '月销量': '',
                        '菜品': u'猪杂炒伊面'},
                       {'价格': u'¥12/份',
                        '月销量': u'月售1份',
                        '菜品': u'牛肉炒伊面'},
                       {'价格': u'¥13/份',
                        '月销量': u'月售1份',
                        '菜品': u'牛杂炒伊面'},
                       {'价格': u'¥3.5/份',
                        '月销量': u'月售29份',
                        '菜品': u'椰子汁'},
                       {'价格': u'¥3/份',
                        '月销量': u'月售23份',
                        '菜品': u'鲜磨豆奶'},
                       {'价格': u'¥3/份',
                        '月销量': u'月售14份',
                        '菜品': u'盒装加多宝'},
                       {'价格': u'¥5/份',
                        '月销量': u'月售15份',
                        '菜品': u'听装加多宝'},
                       {'价格': u'¥3/份',
                        '月销量': u'月售17份',
                        '菜品': u'盒装王老吉'},
                       {'价格': u'¥2.5/份',
                        '月销量': u'月售28份',
                        '菜品': u'娃哈哈矿泉水'},
                       {'价格': u'¥4.5/份',
                        '月销量': u'月售16份',
                        '菜品': u'脉动'},
                       {'价格': u'¥4.5/份',
                        '月销量': u'月售17份',
                        '菜品': u'阿萨姆奶茶'},
                       {'价格': u'¥3.5/份',
                        '月销量': u'月售22份',
                        '菜品': u'冰红茶'},
                       {'价格': u'¥3.5/份',
                        '月销量': u'月售26份',
                        '菜品': u'绿茶'},
                       {'价格': u'¥3.5/份',
                        '月销量': u'月售3份',
                        '菜品': u'芬达'},
                       {'价格': u'¥3.5/份',
                        '月销量': u'月售10份',
                        '菜品': u'雪碧'},
                       {'价格': u'¥3.5/份',
                        '月销量': u'月售21份',
                        '菜品': u'可乐'}]}
征棹 2022-09-10 12:57:07

看到你的提问和爬取的内容发现是来自南宁的友仔!看到那些老友系列深感亲切!
我最近刚刚接触2个月 了解到一些 总结了一点点规律 是这样的
打开网页出现的一般标签正常的是可以用pyspider response.doc直接爬取
如果是js代码更改好出现的标签
需要在crawl的是时候加 fetch_type=js 可以加载出js加载出来的标签
可以尝试一下

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文