前言
当年发现selenium的时候宛如打开新世界的大门,使用起来简单易上手,对于新手十分友好。在anaconda上安装selenium即可使用。其优势在于可以和chrome浏览器提供的xpath完美结合,简化了分析标签的过程。
本次爬虫暂时先以爬取GitHub上不同语言下不同热度的项目及其fork, watch, star和标注的标签作为练习。
1.目标网页爬取分析
首先在GitHub上搜索java,点击most stars,网站会根据star数目将GitHub上代管的java语言编写的项目降序排序,分析其连接,使用的是显示传参,方便解析。
https://github.com/search?o=desc&p=2&q=java&s=stars&type=Repositories
其中,o代表升序或者是降序,p表示页码,s表示排序的依据,q表示搜索的关键字,可以根据自己的需要进行替换,但是这里对于每个项目只显示了star数目,没有显示其他有用的信息,所以需要到每一个项目具体的展示页才能看到所有的信息。
所幸,每个项目自己的详细页面是由https://github.com/ 和用户名+项目名组成的,所以可以先将搜索页面里的项目名称存到本地数据文件中,再顺序索引访问。
总的来说,本次爬虫需要爬取的网页有两部分,一部分是项目列表,另一部分是每个项目的具体信息。
2.网页信息获取
开头说道,之所以使用selenium,就是为了能够结合xpath,简化数据获取的过程,那么如何通过chrome获得想要获取的内容呢?
首先,当打开任意界面后,在想获取的内容上面右键单击,选择“检查”,
此时,浏览器会自动展示需要的内容所对应的html标签,为了获得需要信息在当前页面的路径,可以将鼠标放在高亮块上,右键单击复制XPath,
此时,使用Ctrl V就可以将其路径复制到任意文本或者代码中了。
3.selenium使用
selenium开发之初是自动测试框架,但是因为完善的网页操作,所以也可以当作爬虫使用,其使用过程也很简单。
首先,需要给chrome浏览器安装chromedriver.exe驱动,只需要将exe文件放在anaconda的script下即可;
之后,在代码中,编写如下代码,即可启动该测试框架;
driver = webdriver.Chrome()
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
此时,会弹出一个受控的浏览器,调用get(nextpage)函数( nextpage 是目标链接);
driver.get(nextpage)
浏览器就会跳转到目标页面,
这时候就用到了上文获取的xpath信息,通过find_element_by_xpath()函数,即可获得标签块,如果要获得文本,只需要再调用一次.text属性,
content=driver.find_element_by_xpath('//*[@id="js-pjax-container"]/div/div[3]/div/ul/li['3']/div[2]/div[1]/a').text
此时,需要获得的属性就已经存到了content里面。
按照这种方法,就可以将需要获得信息依次存储到本地的变量中。
4.数据存储
因为数据量比较大,所以需要存储到本地文件中,这里为方便起见使用excel,存储代码如下(不完整):
f = open("E://Pycharm//deleted//software_spider//result//res_"+language_type[language_index]+".csv", "w", encoding='utf-8')
writer = csv.writer(f)
content=["subject", "watch", "star", "fork"]
for iii in range(0,len(taglist)):
content.append(taglist[iii])
writer.writerow(content)
f.close()
使用csv库的优势是方便后续继续添加。
5.爬取注意事项
(1)为了避免频繁访问触发网站反扒机制,此处在每次网页跳转前会调用系统函数time.sleep()挂起若干秒,这样才能持续访问,经测试,比较合适的间隔大概为7秒;
(2)因为连接过程不一定一直保持稳定,所以建议每执行一段时间就自动保存当前的内容,防止因为网络连接问题前功尽弃;
(3)对于xpath不方便解析的情况,可以使用beautifulsoup进行解析;
6.结果
本次针对Java. C, Python等十种编程语言进行爬取分析,每种编程语言下爬取star最多的100个项目,中等star数的50个项目,和star数较少的50个项目。共计爬取2000个项目,每个项目包含了star, watch, fork和标注的标签信息。