玩转Python之“手把手”教你爬数据(一)
本文作者:钱梦璇
文字编辑:宁刘莹
技术总编:张 邯
在大数据时代,海量数据应运而生。各行各业都需要利用网络爬虫技术来获取研究数据,这项“技能”对越来越多的人来说是必不可少的。本文将带领大家学习如何利用Python语言来进行网页数据爬取。
我们爬取的页面是多彩投(全球专业实体空间投资平台https://www.duocaitou.com/)网站中的所有项目,以及每个项目所对应的发起团队的详细信息。
一.介绍爬取内容
进入网页之后,点击菜单栏中的“项目”选项,可以看到如图所示的界面:
在此页面下拉,发现共有97页项目信息。我们的目标一是爬取这97页内的所有项目信息。
以第一个项目(宿舍·北京鼓韵国际青年旅舍)为例,点击进入页面,下拉可以找到发起团队的信息(见下图),我们的目标二是爬取所有项目的发起团队中每位成员的详细信息。
二. 获取单个页面的项目信息(一级爬虫)
(1)引入Python标准库和第三方库
在这里,我们用到的标准库和第三方库分别为json和Requests。json是一种轻量级的数据交换格式,它将数据以键值对和数值列表的形式有序存储,这种数据形式易于人们阅读,也易于电脑解析。Requests库可以使我们抓取到网页的内容,通过HTTP协议获取网络上的资源。
import requests #requests用来抓取网页源代码
import json #使用json函数需要导入json库
(2)构建headers,抓取网页源代码
当浏览器请求网页时,它会向Web 服务器发送特定信息。但是这些信息是不能被直接读取的,而是作为HTTP 请求头的一部分进行传输的。
因此,我们通过构建一个名为headers的字典来传入请求头的部分信息。打开网页https://www.duocaitou.com/project?pageNum=1,显示了第一页内的项目信息。进入开发者模式,在网页内下拉后发现在工具列表底部会弹出一个新的网页链接goProject,进入这个链接,查看它的Response即返回信息,发现其返回的字典中“data”键内的“list”对应了这一页中的所有项目信息,如下图所示(只截取一部分)。也就证明我们找到了所需信息对应的真实链接。
此时点击Response旁的Headers,可以看到网页的请求方式为POST,并找到其请求头(Requestheaders)和Payload报文,如下图所示:
需要注意的是,在通过requests.post()进行POST请求时,传入的其中一个参数为data。常见的form表单可以直接使用data参数进行报文提交;在这里我们遇到的是payload报文,这是一种json格式的报文,因此传入的报文对象也就是json格式的。它们的区别是第一种情况下post请求的Content-Type为application/x-www-form-urlencoded(默认的),请求表单的参数是在FormData中;第二种情况下Content-Type设置为application/json;charset=UTF-8,参数在RequestPayload中。
根据以上分析,我们可以抓取第一页的项目信息,程序如下所示:
import requests
import json
url="https://pcapi.duocaitou.com/pc/project/goProject"
headers={"Accept": "application/json, text/plain, */*",
"Content-Type": "application/json;charset=UTF-8",
"Referer": "https://www.duocaitou.com/project?pageNum=1",
"Sec-Fetch-Mode": "cors",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
}
data={"pageNum":"1", "pageSize": "9"} # pageNum=1表示第一页
req=json.loads(requests.post(url,headers=headers,data= json.dumps(data)).text)["data"]["list"]
print(req)
由于传入的payload报文是json格式的,首先需要利用json.dumps()函数将data进行json编码,通过POST请求方式对目标网站发起请求。之后通过json.loads()函数将已编码的json字符串解码为Python对象,最终获取的返回值就是上图“list”中对应的项目信息。结果如下所示(只截取一部分):
至此,我们就得到了第一页的项目信息啦。在后续文章中,小编会继续介绍多彩投项目的二级爬虫以及函数的封装等,大家要记得关注哦~
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。