Python爬虫根据关键词爬取知网论文摘要并保存到数据库中【入门必学】
程序员文章站
2022-03-07 16:03:13
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:崩坏的芝麻 由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口 比如下面这个网页:htt ......
前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:崩坏的芝麻
由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口
比如下面这个网页:
http://search.cnki.net/search.aspx?q=肉制品
搜索出来的结果和知网上的结果几乎一样,另外以后面试找python工作,项目经验展示是核心,如果你缺项目练习,去小编的python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面很多新教程项目
在这个基础上,我简单看了些网页的结构,很容易就能写出爬取得代码(是最基础的,相当不完善,增加其他功能可自行增加)
网页的结构还是很清晰的
摘要信息也很清晰
我使用的是 pymysql 连接的数据库,效率也还可以
下面直接贴代码:
# -*- coding: utf-8 -*- import time import re import random import requests from bs4 import beautifulsoup import pymysql connection = pymysql.connect(host='', user='', password='', db='', port=3306, charset='utf8') # 注意是utf8不是utf-8 # 获取游标 cursor = connection.cursor() #url = 'http://epub.cnki.net/grid2008/brief/detailj.aspx?filename=rlgy201806014&dbname=cjfdlast2018' #这个headers信息必须包含,否则该网站会将你的请求重定向到其它页面 headers = { 'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'accept-encoding':'gzip, deflate, sdch', 'accept-language':'zh-cn,zh;q=0.8', 'connection':'keep-alive', 'host':'www.cnki.net', 'referer':'http://search.cnki.net/search.aspx?q=%e4%bd%9c%e8%80%85%e5%8d%95%e4%bd%8d%3a%e6%ad%a6%e6%b1%89%e5%a4%a7%e5%ad%a6&rank=relevant&cluster=zyk&val=cdfdtotal', 'upgrade-insecure-requests':'1', 'user-agent':'mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/55.0.2883.87 safari/537.36' } headers1 = { 'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36' } def get_url_list(start_url): depth = 20 url_list = [] for i in range(depth): try: url = start_url + "&p=" + str(i * 15) search = requests.get(url.replace('\n', ''), headers=headers1) soup = beautifulsoup(search.text, 'html.parser') for art in soup.find_all('div', class_='wz_tab'): print(art.find('a')['href']) if art.find('a')['href'] not in url_list: url_list.append(art.find('a')['href']) print("爬取第" + str(i) + "页成功!") time.sleep(random.randint(1, 3)) except: print("爬取第" + str(i) + "页失败!") return url_list def get_data(url_list, wordtype): try: # 通过url_results.txt读取链接进行访问 for url in url_list: i = 1; if url == pymysql.null or url == '': continue try: html = requests.get(url.replace('\n', ''), headers=headers) soup = beautifulsoup(html.text, 'html.parser') except: print("获取网页失败") try: print(url) if soup is none: continue # 获取标题 title = soup.find('title').get_text().split('-')[0] # 获取作者 author = '' for a in soup.find('div', class_='summary pad10').find('p').find_all('a', class_='knowledgenetlink'): author += (a.get_text() + ' ') # 获取摘要 abstract = soup.find('span', id='chdivsummary').get_text() # 获取关键词,存在没有关键词的情况 except: print("部分获取失败") pass try: key = '' for k in soup.find('span', id='chdivkeyword').find_all('a', class_='knowledgenetlink'): key += (k.get_text() + ' ') except: pass print("第" + str(i) + "个url") print("【title】:" + title) print("【author】:" + author) print("【abstract】:" + abstract) print("【key】:" + key) # 执行sql语句 cursor.execute('insert into cnki values (null, %s, %s, %s, %s, %s)', (wordtype, title, author, abstract, key)) # 提交到数据库执行 connection.commit() print() print("爬取完毕") finally: print() if __name__ == '__main__': try: for wordtype in {"大肠杆菌", "菌群总落", "胭脂红", "日落黄"}: wordtype = "肉+" + wordtype start_url = "http://search.cnki.net/search.aspx?q=%s&rank=relevant&cluster=zyk&val=" % wordtype url_list = get_url_list(start_url) print("开始爬取") get_data(url_list, wordtype) print("一种类型爬取完毕") print("全部爬取完毕") finally: connection.close()
在这里的关键词我简单的选了几个,作为实验,如果爬取的很多,可以写在txt文件里,直接读取就可以,非常方便。