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

优采云 发布时间: 2020-08-12 10:24

  开启F12开发者工具,并且刷新当前页面:

  可以看见切换到第二页时侯,我们的url没有变化,网站也没有手动进行刷新跳转操作(web中ajax技术就是在保证页面不刷新,url不变化情况下进行数据加载的技术)

  

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

  

  分析到这儿可以获知 我们数据是以json格式交互

  分析第二页的json文件恳求地址与第三页json文件恳求地址

  第二页:%E7%81%AB%E9%94%85

  第三页:%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) + '\n')

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

if __name__ == '__main__':

start()

  运行结果如下:

  

  本地文件:

  

  共写入1024条数据

  .

  总结:

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线