【Python】一个简单的爬取万方数据库文章基础信息的爬虫
源代码地址:点我进入GitHub项目网址.
因为课程需要,需要爬取某个领域文章的关键字以及作者等基础信息,因此写了一段简单的小爬虫来获取一些基础信息并存储在excel表格中,由于懒得和知网的反爬周旋以及偶然发现万方并不限制爬虫(可能不是那么强),所以转战万方爬取。速度大概是2小时5万篇,接下来会进行改进,加快速度,希望大家支持~
需要的库
- pandas
- numpy
- bs4
- urllib.request
- csv,codecs
- xlsxwriter
- re
- random
- os
- time
分析网页
首先打开万方知识库,随便搜索一个关键词,如互联网
,进入搜索结果界面:
可以看到这个页面包含我们想要获取的所有信息:作者、题目、关键字。 第一步,我们想知道翻页的机制,首先点击第二页,先看网页的url有没有变化,发现由http://s.wanfangdata.com.cn/Paper.aspx?q=%E4%BA%92%E8%81%94%E7%BD%91&f=top&p=
变为http://s.wanfangdata.com.cn/Paper.aspx?q=%E4%BA%92%E8%81%94%E7%BD%91&f=top&p=2
,也就是说万方的url的翻页机制的关键是p=‘num’,这个num就是对应的页码。
了解了翻页机制后,我们就可以查看网页源代码,看看我们需要的信息在哪里:
在知道了以上信息后就可以编写爬取的代码了。
关键代码
发送请求
head = random.choice(user_agents) //随机选择user_agents
kv = {'User-Agent':head}
url = url_original+ str(i)
resp = urlrequest.Request(url,headers =kv)
urlrequest.install_opener(opener)
paper_content = urlrequest.urlopen(resp).read()
BS
然后使用BeautifulSoup对网页进行解析:
paper_html = paper_content.decode('utf-8')
paper_soup = BeautifulSoup(paper_html,'html.parser')
paper_title_list = []
爬取
for paper in allpaper_list:
paper_data = paper.find(class_='record-title')
paper_title = paper_data.find('a',class_='title')
paper_title_str = str(paper_title)
paper_title_string = re.findall(re_words,paper_title_str)
使用中间一段爬取title的过程为例,发现源代码中的标题放在<record-title>
下的<title>
标签下,于是采取find方法提取内容。
反爬
使用代理
和限制爬取频率
这两种办法
Python proxy = random.choice(proxy_list)
构建一个代理池,每次爬取时随即使用一个ip,防止被反爬。
Python time.sleep(3)
每一次爬取时可以限制速率,每爬取一次暂停3秒钟,如果想获得更好的伪装,可以使用随机数暂停时间。