其实github的爬取相对来说是比较简单的,可以不用框架直接使用requests和BF就可以完成一个纵向的爬取。
代理工具:fiddler
首先说一下这次爬取的数据,是github上递归的爬取使用者主页的信息,包括博主和此博主主页上最受欢迎的六个项目(Popular Repositories)项目的名称,简介,星数和转载数。
这是爬取的信息。
接下来我们来分析github的爬取,从登陆到递归爬取的整个过程。
第一步:我们登陆试试,用fiddler截取一下login页面的post请求,分析一下登陆需要传递给主机的data。
首先我们到login页面,输入密码账号然后发出post请求
通过fidddler的截取,我们获得了post请求。如图
如图中,我们就有了post请求需要发送给主机的数据,他们是:
commit :Sign in
utf8 :✓
authenticity_token :36lBh69HcWi1QIS4DrgIwpXrT8KZ5QBuxZwrOP5upQPP+ARZFFQ8aljDFg4ZlOxoxPgbKmWHE7UV8tB7CUIxeg==
login :username
password :password以上,我们知道除了用户名和密码,我们不知道的数据是“authenticity_token”,这个数据从哪里来呢?你可以考虑是js动态计算出来的,但是好像没有js文件。其实我们首先应该考虑从login页面中提取出来。那我们截取login页面,看一下从login响应体中是不是可以提取出想要的“authenticity_token”.
如图,我们截取了login页面,通过搜索,找到了参数。
现在需要的只是把“authenticity_token”参数提取出来。
在贴出这一段代码之前,我们应该明白requests模块的session对象。session对象实例,是一个对话的实例,它可以跨请求保持cookie(在计算机网络相关知识中有队session的详细解释)。也就是通过cookie发送的所有请求都保持着登陆上去的cookies。接下来我们贴出这段的代码。
def login(self, user_name, password):
# 传进必要的参数,然后登陆
post_data = {
"commit":"Sign in",
"utf8":"✓",
"authenticity_token":self.parse_loginPage(),
"login":user_name,
"password":password
}
logined_html = self.session.post(url=self.post_url, data=post_data, headers=self.logined_headers, verify=False)
if logined_html.status_code == 200:
dashboardHtml = self.session.get(url=self.logined_url, headers=self.login_headers, verify=False)
self.parse_loginedHtml(dashboardHtml)
# 函数用于解析登陆后的主页,主页上有你关注人的最新动态,通过这个为入口,进行递归查询。
主页:
图示的方框中的动态版就是我们爬取的入口。
其url为:https://github.com/dashboard-feed
在其中提取出人名就可,然后我们就可以构造其他人的主页链接,就可以进一步爬取了。
主页中我们爬取的内容用方框框起来了。