其他
实战演练-如何获取众筹项目的团队信息
本文作者:周宏杰
文字编辑:余术玲
技术总编:张 邯
一、网站介绍
import os
import json
import requests
import os
import requests
import json
url='https://www.minipo.com/api/project/stock/list'
headers= {
'accept': 'application/json, text/plain,*/*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization':'446ebd279c16a66f1ed49d6a2e1b60ef6a1b6a64e0994c61ded3ebf7e3ff7f94',
'content-length': '32',
'content-type':'application/x-www-form-urlencoded;charset=UTF-8',
'cookie': '_ga=GA1.2.1746701206.1562657611;_gid=GA1.2.1392197811.1562657611;Hm_lvt_3cc5eb43ee2bec55f862cdef86106e7d=1562657611;minipossid=c54a8qc3dc1gv65s7hpjdhb789; minipo_token=446ebd279c16a66f1ed49d6a2e1b60ef6a1b6a64e0994c61ded3ebf7e3ff7f94;Hm_lpvt_3cc5eb43ee2bec55f862cdef86106e7d=1562658540;_gat_gtag_UA_128202395_1=1',
'origin': 'https://www.minipo.com',
'referer':'https://www.minipo.com/list/invest',
'user-agent': 'Mozilla/5.0 (Windows NT 6.3;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100Safari/537.36',
}
formdata={
'page': '1',
'size': '16',
'status': '',
'keywords': '',
}
id_single= requests.post(url,headers = headers,data = formdata)
dicta= json.loads(id_single.text) #将已编码的JSON 字符串解码为 Python 对象
print(dicta)
idget=[]
for i in range(len(dicta['data']['data'])): #因为不同页面可能项目数不同,因此用len()命令来获取每一页网页的项目数
dicta = json.loads(id_single.text)['data']['data'][i]['id']
idget.append(dicta) #将一个主页面的每个项目的id信息拼在一起
print(idget)
输出结果如下:
import os
import requests
import json
idget = []
for num in range(1,6):
url='https://www.minipo.com/api/project/stock/list'
headers = {
'accept': 'application/json, text/plain, */*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization': '446ebd279c16a66f1ed49d6a2e1b60ef6a1b6a64e0994c61ded3ebf7e3ff7f94',
'content-length': '32',
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
'cookie': '_ga=GA1.2.1746701206.1562657611; _gid=GA1.2.1392197811.1562657611; Hm_lvt_3cc5eb43ee2bec55f862cdef86106e7d=1562657611; minipossid=c54a8qc3dc1gv65s7hpjdhb789; minipo_token=446ebd279c16a66f1ed49d6a2e1b60ef6a1b6a64e0994c61ded3ebf7e3ff7f94; Hm_lpvt_3cc5eb43ee2bec55f862cdef86106e7d=1562658540; _gat_gtag_UA_128202395_1=1',
'origin': 'https://www.minipo.com',
'referer': 'https://www.minipo.com/list/invest',
'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
}
formdata={
'page': f'{num}', #f代表的是format,指明这里的括号是存在的,而不是字符串
'size': '16',
'status': '',
'keywords': '',
}
id_single = requests.post(url,headers = headers,data = formdata)
a = json.loads(id_single.text)
for i in range(len(a['data']['data'])):
dicta = json.loads(id_single.text)['data']['data'][i]['id'] #将已编码的 JSON 字符串解码为 Python 对象
idget.append(dicta)
print(idget)
总共储存了67个id。
四、创始团队成员信息的爬取
以爬取“军工缔造者”项目的创始团队信息为例,该页面内容如下:
该页面访问方式也是POST请求,因此需要找到url
、headers、data。
url、headers、data具体内容正如上图所示,分别为RequestURL、Request Headers、Form Data。接下来即可爬取所有项目创始团队信息,具体命令行如下:
teaminfo=[]
for id1 in idget:
url1=f'https://www.minipo.com/api/project/stock/{id1}/detail'
headers1 = {
'accept': 'application/json, text/plain, */*',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'authorization': '446ebd279c16a66f1ed49d6a2e1b60ef6a1b6a64e0994c61ded3ebf7e3ff7f94',
'content-length': '32',
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
'cookie': '_ga=GA1.2.1746701206.1562657611; _gid=GA1.2.1392197811.1562657611; Hm_lvt_3cc5eb43ee2bec55f862cdef86106e7d=1562657611; minipossid=c54a8qc3dc1gv65s7hpjdhb789; minipo_token=446ebd279c16a66f1ed49d6a2e1b60ef6a1b6a64e0994c61ded3ebf7e3ff7f94; Hm_lpvt_3cc5eb43ee2bec55f862cdef86106e7d=1562658540; _gat_gtag_UA_128202395_1=1',
'origin': 'https://www.minipo.com',
'referer': 'https://www.minipo.com/list/invest',
'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
}
formdata1={
'id': f'{id1}'
}
team = requests.post(url=url1,headers = headers1,data = formdata1)
team_dicta = json.loads(team.text)
teaminfo.append(team_dicta) #这里把所有含团队信息的页面都连在一起
print(teaminfo)
部分输出结果如下图所示:
五、创建csv文件并保留需要内容
varname = ['programname', 'id', 'start_time','cf_raising', 'cf_max_raising', 'cf_success_raising_offer','current_rate','personname', 'position', 'desc']
varname1 = ['name', 'id', 'start_time', 'cf_raising','cf_max_raising', 'cf_success_raising_offer', 'current_rate']
varname2 = ['name', 'position', 'desc']
with open("D:\\minipo.csv", "w",encoding="gb18030") as f: # 以读写方式创建"minipo.csv"文件并返回文件对象"f"
f.write("\t".join(varname) + "\n") # f.write()是输入括号内的内容。将varname中的元素用制表符\t隔开输入csv文件,并让每个元素作为每一列的标题
for unit in teaminfo: #unit是每个项目
info = []
for i in varname1:
info.append(str(unit['data'][i]).replace("\n","").replace("\t", "").replace("\r","")) #为避免原数据中自带的换行符、制表符、回车符导致格式混乱,需要去除自带的这些符号
if type(unit['data']['team']) is list: # 当没有团队信息时,会返回字符串None,为了避免的None的影响,我们需要只对列表也就是有信息的部分进行处理
for u in unit['data']['team']: #u是每个成员
info1 = []
for j in varname2:
info1.append(str(u[j]).replace("\n","").replace("\t", "").replace("\r",""))
f.write('\t'.join(info)+'\t'+'\t'.join(info1)+"\n")
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。