python爬虫:爬取某图外卖数据有这篇文章就够了[Python基础]

python

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于腾讯云 作者:Python进阶者

( 想要学习Python?Python学习交流群:1039649593,满足你的需求,资料都已经上传群文件流,可以自行下载!还有海量最新2020python学习资料。 )

1.分析美团美食网页的url参数构成

1)搜索要点

美团美食,地址:北京,搜索关键词:火锅

2)爬取的url

https://bj.meituan.com/s/%E7%81%AB%E9%94%85/

3)说明

url会有自动编码中文功能。所以火锅二字指的就是这一串我们不认识的代码%E7%81%AB%E9%94%85。

通过关键词城市的url构造,解析当前url中的bj=北京,/s/后面跟搜索关键词。

这样我们就可以了解到当前url的构造。

2.分析页面数据来源(F12开发者工具)

开启F12开发者工具,并且刷新当前页面:可以看到切换到第二页时候,我们的url没有变化,网站也没有自动进行刷新跳转操作。(web中ajax技术就是在保证页面不刷新,url不变化情况下进行数据加载的技术)

此时我们需要在开发者工具中,找到xhr里面对应当前数据的响应文件。

分析到这里可以得知:我们的数据是以json格式交互。分析第二页的json文件请求地址与第三页json文件的请求地址。

第二页:https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset=32&cateId=-1&q=%E7%81%AB%E9%94%85

第三页:https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset=64&cateId=-1&q=%E7%81%AB%E9%94%85

对比发现:offse参数每次翻页增加32,并且limit参数是一次请求的数据量,offse是数据请求的开始元素,q是搜索关键词poi/pcsearch/1?其中的1是北京城市的id编号。

3.构造请求抓取美团美食数据

接下来直接构造请求,循环访问每一页的数据,最终代码如下。

import requests

import re

def start():

for w in range(0, 1600, 32):

#页码根据实际情况x32即可,我这里是设置50页为上限,为了避免设置页码过高或者数据过少情况,定义最大上限为1600-也就是50页,使用try-except来检测时候异常,异常跳过该页,一般作为无数据跳过该页处理

try:

# 注意uuid后面参数空余将uuid后xxx替换为自己的uuid参数

url = "https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset="+str(w)+"&cateId=-1&q=%E7%81%AB%E9%94%85"

#headers的数据可以在F12开发者工具下面的requests_headers中查看,需要实现选择如下headers信息

#必要情况 请求频繁 建议增加cookie参数在headers内

headers = {

"Accept": "*/*",

"Accept-Encoding": "gzip, deflate, br",

"Accept-Language": "zh-CN,zh;q=0.9",

"Connection": "keep-alive",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400",

"Host": "apimobile.meituan.com",

"Origin": "https://bj.meituan.com",

"Referer": "https://bj.meituan.com/s/%E7%81%AB%E9%94%85/"

}

response = requests.get(url, headers=headers)

#正则获取当前响应内容中的数据,因json方法无法针对店铺特有的title键值进行获取没所以采用正则

titles = re.findall("","title":"(.*?)","address":"", response.text)

addresses = re.findall(","address":"(.*?)",", response.text)

avgprices = re.findall(","avgprice":(.*?),", response.text)

avgscores = re.findall(","avgscore":(.*?),",response.text)

comments = re.findall(","comments":(.*?),",response.text)

#输出当前返回数据的长度 是否为32

print(len(titles), len(addresses), len(avgprices), len(avgscores), len(comments))

for o in range(len(titles)):

#循环遍历每一个值 写入文件中

title = titles[o]

address = addresses[o]

avgprice = avgprices[o]

avgscore = avgscores[o]

comment = comments[o]

#写入本地文件

file_data(title, address, avgprice, avgscore, comment)

#文件写入方法

def file_data(title, address, avgprice, avgscore, comment):

data = {

"店铺名称": title,

"店铺地址": address,

"平均消费价格": avgprice,

"店铺评分": avgscore,

"评价人数": comment

}

with open("美团美食.txt", "a", encoding="utf-8")as fb:

fb.write(json.dumps(data, ensure_ascii=False) + "

")

#ensure_ascii=False必须加因为json.dumps方法不关闭转码会导致出现乱码情况

if__name__ == "__main__":

start()

运行结果如下:

本地文件:

4.总结

根据搜索词变化,城市变化,可以改变url中指定的参数来实现。同时也要记得变更headers中的指定参数,方法简单,多加练习即可熟悉ajax类型的数据抓取。

以上是 python爬虫:爬取某图外卖数据有这篇文章就够了[Python基础] 的全部内容, 来源链接: utcz.com/z/529930.html

回到顶部