学习爬虫开始,我就想着对CNKI主题文献进行爬虫,对感兴趣的主题文章进行抓取,获取相关文章的基本信息和摘要,方便快速了解某一个领域的研究进程,重点等等。
经过不断的修改,终于完成此目的。
在此爬虫程序编写过程,需要注意几个问题。
1. 选择合适的网站入口;
一般我们进入知网是www.cnki.net,我发现对此网站进行爬取,难以获取完整的网站源码,最后发现 http://search.cnki.net/ 能得到完整源码。
2. 分析网站URL:
将图中的URL复制出来,得到下面的URL: http://search.cnki.net/search.aspx?q=%E7%B2%BE%E5%87%86%E6%89%B6%E8%B4%AB&rank=citeNumber&cluster=all&val=&p=0 发现被编码了,需要对复制出来的URL使用 urllib.unquote() 解码。
分析解码后的URL:http://search.cnki.net/search.aspx?q=精准扶贫&rank=citeNumber&cluster=all&val=CJFDTOTAL&p=0 ; 通过选择不同的排序,不同的搜索关键词,以及不同的文献类型,可以确定 "q="字段控制搜索的关键词,"rank=" 控制排序方式,“p=” 字段控制了翻页, 并且步长为15。最终确定搜索URL为:url='http://search.cnki.net/search.aspx?q='+str(keywords)+'&rank=citeNumber&cluster=all&val=CJFDTOTAL&p='+'number'。
3. 转码问题:
在爬取网页过程中,发现得到的网页源码打印出来后,是乱码,最终发现是因为网页源码的编码方式并不是UTF-8,因此,为了得到可以用于解析的的网页源码,需要对网页源码进行转码,首先从原始编码方式转化为通用型的Unicode,然后再转码为:UTF-8, 转码方式:
f=requests.get(test,headers=headers) # 获得网页源码
ftext=f.text.encode(f.encoding).decode('utf-8') # 转码成可以分析的编码
4. 代理IP问题:
在爬虫过程中,爬取少量网页和爬取大量网页存在较大区别。爬取较少网页是,被爬的服务器不会拒绝,当访问过多,就可能造成拒绝访问,被屏蔽IP的问题。这个时候就需要使用代理IP去访问。代理IP实现“瞒天过海”之计,让被访问的服务器显示的IP地址是爬虫程序设定的IP,而非计算机真实的IP地址,就算发现是爬虫程序,被屏蔽的IP是代理IP,而非真实的计算机IP地址。
对CNKI网站进行爬虫时,发现当爬取450篇信息后,IP 就会被屏蔽,需要填写验证码,导致无法连续爬取,因此需要设置代理IP。 代理IP地址可以去一些网站去爬取,本程序使用了:http://www.xicidaili.com/nt/ 提供的免费代理IP。
5. 分功能设置函数:
为了使得代码逻辑清晰,可以分不同的目的设置不同的函数。注意各个函数之间的参数传递,容易出错。
6. 网站源码自身的不规则:
在测试程序过程中,大部分文章爬取成功,但是,存在小部分文章爬取失败,按照道理,编码一样话,那应该同时成功,同时失败。选择爬取“成功”和“失