python爬虫爬取微信公众号小程序信息
爬取内容
某汽车维修信息提供的维修店名称,地点以及电话(手机)号码
爬取步骤
啥也别管,先抓包看看,在这里,博主使用的抓包软件是charles
抓包:将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。
进入小程序主界面如下:
我们可以发现左上有一个定位选择地点的选项,点击后查看charles,仔细查看,我们会发现一个名为GetRegionOptions的json,里面有关于每个城市省份的name和一个value值,有什么用我们待会再讲,我们先随便选择一个城市–湖南
然后再点击主界面的汽车维修,再看抓取到的内容,同样能看到每个选项以及id,每个id代表单独一项,以此来识别不同类别的数据
我们点击小车维修,再次查看寻找,会发现我们已经找到了自己想要的东西(英文翻译很直观!)
既然找到我们需要的数据在哪,然后我们就要发送请求来获取我们所需要的数据,那我们怎样获取到指定数据呢?如某个省份某个市某种类型车的数据,前面分析的时候我们就已经知道,可以在请求的时候带上data ,里面包含了各项的id,这样就能准确获取数据,只需要将其整理在一起,遍历其就能自动化获取数据
具体代码在下面
源代码:
import requests
import json
import xlrd
import xlwt
title = ['name','contactPhone','cityName']
url_car = 'http://api.tc688.net/api/services/app/merchant/LoadCategoryMerchants'
headers = {
'accept':"application/json",
'Origin':"http://zazhi.tc688.net",
'Cache-Control':'max-age=0',
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1301.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat",
'Accept-Encoding':"gzip, deflate",
'Referer':'http://zazhi.tc688.net/companylist?id=148',
'Accept-Language':"zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.5;q=0.4",
}
# 判断是否爬完
def end_run(result):
if len(result): #当result为空(长度为0)则代表爬完
return 0;
else:
return 1;
# 获取我们想要的数据
def get_datas(index):
data = {"pageIndex":index,"pageSize":50,"regionId":"32","categoryId":"148","orderRule":0}
res = requests.post(url=url_car, headers=headers, data=data)
js = json.loads(res.text)
return js.get("result")
# 处理数据并存储到表格
def dealdata(xls_name, sheet_name):
k = 0 # 累加计算有多少个数据
page = 1
wb = xlwt.Workbook(xls_name)
worksheet = wb.add_sheet(sheet_name)
for i in range(len(title)):
worksheet.write(0,i,title[i])
while(page):
page+=1
datas = get_datas(page)
if end_run(datas):
print('数据获取结束')
break
for i in datas:
worksheet.write(k+1,0,i['name'])
worksheet.write(k + 1, 1, i['contactPhone'])
worksheet.write(k + 1, 2, i['cityName'])
k+=1
print(f"正在获取第{k}个数据 名称:{i['name']} 手机{i['contactPhone']}")
wb.save(xls_name)
if __name__ == '__main__':
### 要将数据存储到的文件和地点名称
dealdata('datas.xls','chongqing')
注:代码只简略爬取了一个城市的数据,懒.