写在前面的话,还处于爬虫初期,很多东西一知半解,边学边记录,边学边做。代码写的自己都看不下去了。。。。
本期重点,美团网商铺数据,暂只抓了美食商家数据。先上战果,暂只抓了10万条,一小时左右,未对数据去重。大概思路如下,先抓取各个省份城市,然后获取其经纬度,最后构造参数,翻页拿取数据。抓取结果
- 获取各个城市名字,id。第一个地址(https://www.meituan.com/ptapi/getprovincecityinfo/)
- 获取各个城市经纬度,构造参数。第二个地址(https://apis.map.qq.com/jsapi?qt=poi&wd=西安&pn=0&rn=10&rich_source=qipao&rich=web&nj=0&c=1&key=FBOBZ-VODWU-C7SVF-B2BDI-UK3JE-YBFUS&output=jsonp&pf=jsapi&ref=jsapi&cb=qq.maps._svcb3.search_service_0&)
- 构建请求参数,翻页获取数据。第三个地址(https://www.meituan.com/meishi/api/poi/getNearPoiList?offset=0&limit=10&cityId=1&lat=39.950256&lng=116.34784)此地址浏览器拿不到数据,需要用到postman测试,是个坑
抓包的查找接口的过程如下
再切换城市栏目可以通过chrome抓包拿到所有城市的id,name,便于我们下一步去获取经纬度参数,地址见第一条
然后到首页点击美食,随便点进一个商家 ,抓包拿到下面信息。
postman测试参数如下图。
有个小坑需要注意,headrs请求头如下图
返回数据如下图
至此我们已经知晓大概流程。以及关键参数,下面就是代码实现模块。代码中涉及到的数据库连接方式。查询、插入操作都需要重写,代码中为自己封装的一些默认连接。
import requests
import json
import re
import time
import logging
logging.captureWarnings(True)
from multiprocessing import Pool
class MeiTuan:
def __init__(self):
self.headers= {
"Content-Type": "application/json;charset=utf-8",
"Host": "www.meituan.com",
"Referer": "https://www.meituan.com/meishi/4813791/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
self.re_w_c = re.compile(r'"city":(.*?)"area')
self.collect = Mongo(db_name='meituan', collecttion_name='shop')#自己写的mongo连接,需要做更改
def all_response(self,url):
"""一个时常用到的请求函数
"""
response = requests.get(url=url,headers=self.headers,verify =False)