数据请求方式为post,提交的表单当中的有效信息为current,用来标记页码。观察表单请求之后直接返回的结果,可以看到请求了一个“getPriceData”的网页。在预览当中可以看到每次返回都是一个字典,包含了一个list,在list当中又通过字典的方式返回数据。
2. 爬取单页数据
import requests
#数据请求
url='http://www./getPriceData.html'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27'}
dat = {'limit': '20',
'current':'1',
'pubDateStartTime': '',
'pubDateEndTime':'' ,
'prodPcatid': '',
'prodCatid':'' ,
'prodName':'' }#表单提交获取第一页信息
resp = requests.post(url,headers=headers,data=dat)
#写入csv文件
import csv
header = ['id', 'prodName', 'prodCatid', 'prodCat', 'prodPcatid', 'prodPcat', 'lowPrice', 'highPrice', 'avgPrice', 'place', 'specInfo', 'unitInfo', 'pubDate', 'status', 'userIdCreate', 'userIdModified', 'userCreate', 'userModified', 'gmtCreate', 'gmtModified'] #数据列名
# test.csv表示如果在当前目录下没有此文件的话,则创建一个csv文件
# “w”表示在写入之前会清空原文件中的数据
# newline是数据之间不加空行
# encoding='utf-8-sig'表示编码格式为utf-8-sig,防止打开csv文件出现中文乱码
with open('test.csv', 'w', newline='',encoding='utf-8-sig') as f:
writer = csv.DictWriter(f,fieldnames=header) # 提前预览列名,当下面代码写入数据时,会将其一一对应。
writer.writeheader() # 写入列名
writer.writerows(resp.json()['list']) # 写入数据
检查test文件当中的内容,数据成功写入。
3. 爬取指定页面数据
前面只是爬取了一页的内容,后面我们将代码进行整合,用循环语句实现多页面的爬取与存储。
import requests
import csv
url='http://www./getPriceData.html'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27'}
dic = list()#定义一个空列表
for page in range(1,10):
dat = {'limit': '20',
'current':page,
'pubDateStartTime': '',
'pubDateEndTime':'' ,
'prodPcatid': '',
'prodCatid':'' ,
'prodName':'' }
resp = requests.post(url,headers=headers,data=dat)
dic.extend(resp.json()['list'])#将新的内容添加到列表当中
print(f'page{page}数据获取完毕')
header = ['id', 'prodName', 'prodCatid', 'prodCat', 'prodPcatid', 'prodPcat', 'lowPrice', 'highPrice', 'avgPrice', 'place', 'specInfo', 'unitInfo', 'pubDate', 'status', 'userIdCreate', 'userIdModified', 'userCreate', 'userModified', 'gmtCreate', 'gmtModified'] #数据列名
# test.csv表示如果在当前目录下没有此文件的话,则创建一个csv文件
# a表示以“追加”的形式写入,如果是“w”的话,表示在写入之前会清空原文件中的数据
# newline是数据之间不加空行
# encoding='utf-8'表示编码格式为utf-8,如果不希望在excel中打开csv文件出现中文乱码的话,将其去掉不写也行。
with open('test.csv', 'w', newline='',encoding='utf-8-sig') as f:
writer = csv.DictWriter(f,fieldnames=header) # 提前预览列名,当下面代码写入数据时,会将其一一对应。
writer.writeheader() # 写入列名
writer.writerows(dic) # 写入数据