输入关键字 抓取所有网页( 文献获取葵花plus,让你写论文不用愁(上) )

优采云 发布时间: 2021-10-17 15:08

  输入关键字 抓取所有网页(

文献获取葵花plus,让你写论文不用愁(上)

)

  

  很多学生已经在毕业的路上,他们不得不面对一个难题,那就是写论文。很多学生为了写论文,得了黑眼圈,但还是一无所获。他们被散文折磨得死去活来,又爱又恨,写散文必不可少的一步就是查资料。古人云:“一本书百读百读。” 或许你在知网多翻翻,就知道怎么写论文了。所以小编今天整理了文献给你搞定Sunflower Plus,让你不用再为写论文发愁了。

  写在前面:

  先看爬取的效果

  

  

  知网的反爬虫方法很强。反正我在PC端爬取的时候,用selenium爬取的时候是拿不到源码的。这真的很烦人。后来换了手机端就搞定了。爬取移动终端的操作如下。首先,进入知网后,选择开发工具,建议放在右边,然后点击图片中的红框,然后刷新网页切换到移动端。

  

  进入手机端界面如下图(注意:记得刷新网页):

  

  这是网址

  

  在调用selenium之前先设置一些参数

  from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byimport timeimport jsonimport csv# 设置谷歌驱动器的环境options = webdriver.ChromeOptions()# 设置chrome不加载图片,提高速度options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})# 创建一个谷歌驱动器browser = webdriver.Chrome(options=options)url = 'http://wap.cnki.net/touch/web/guide'

  既然使用了selenium,那么我们需要获取输入框的id来自动输入关键字,输入关键字然后获取搜索按钮,然后点击

  

  代码如下(输入的关键字是python):

  # 请求urlbrowser.get(url)# 显示等待输入框是否加载完成WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.ID, 'keyword')     ))# 找到输入框的id,并输入python关键字browser.find_element_by_id('keyword').send_keys('python')# 输入关键字之后点击搜索browser.find_element_by_id('btnSearch ').click()

  搜索关键字后跳转到这个界面

  

  通过selenium的显示和等待,我们可以等待其中的一些信息加载完毕,然后进行爬取,这样就可以避免因为元素没有加载而报错。如下图,我们可以知道这个信息在这个div标签中,所以我们可以等待这个元素加载

  

   # 显示等待文献是否加载完成 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located(         (By.CLASS_NAME, 'g-search-body')               )       )

  向下滚动页面,您可以看到加载更多。可以通过显示和等待来判断按钮是否加载。如果在没有加载的情况下点击它,那么会报错。

  

  代码,等待按钮加载并获取按钮

  # 显示等待加载更多按钮加载完成 WebDriverWait(browser, 1000).until(               EC.presence_of_all_elements_located(                   (By.CLASS_NAME, 'c-company__body-item-more')                  )          )          # 获取加载更多按钮         Btn = browser.find_element_by_class_name('c-company__body-item-more')

  基础基本搞定,下一步就是开始获取信息了

  

  获取信息是爬虫的基本能力,这里就不多说了,下图代码见注释

  

  我上面说的就是这样。看图,正好我们需要的信息标签是1、3、5、7、9等等,所以是2*count-1

  

  没什么好说的,代码注释基本都写好了,附上完整代码

  from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byimport timeimport jsonimport csv# 设置谷歌驱动器的环境options = webdriver.ChromeOptions()# 设置chrome不加载图片,提高速度options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})# 创建一个谷歌驱动器browser = webdriver.Chrome(options=options)url = 'http://wap.cnki.net/touch/web/guide'# 声明一个全局列表,用来存储字典data_list = []def start_spider(page): # 请求url browser.get(url) # 显示等待输入框是否加载完成 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.ID, 'keyword') ) ) # 找到输入框的id,并输入python关键字 browser.find_element_by_id('keyword').click() browser.find_element_by_id('keyword_ordinary').send_keys('python') # 输入关键字之后点击搜索 browser.find_element_by_class_name('btn-search ').click() # print(browser.page_source) # 显示等待文献是否加载完成 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, 'g-search-body') ) ) # 声明一个标记,用来标记翻页几页 count = 1 while True: # 显示等待加载更多按钮加载完成 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, 'c-company__body-item-more') ) ) # 获取加载更多按钮 Btn = browser.find_element_by_class_name('c-company__body-item-more') # 显示等待该信息加载完成 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.XPATH, '//div[@id="searchlist_div"]/div[{}]/div[@]'.format(2*count-1)) ) ) # 获取在div标签的信息,其中format(2*count-1)是因为加载的时候有显示多少条 # 简单的说就是这些div的信息都是奇数 divs = browser.find_elements_by_xpath('//div[@id="searchlist_div"]/div[{}]/div[@]'.format(2*count-1)) # 遍历循环 for div in divs: # 获取文献的题目 name = div.find_element_by_class_name('c-company__body-title').text # 获取文献的作者 author = div.find_element_by_class_name('c-company__body-author').text # 获取文献的摘要 content = div.find_element_by_class_name('c-company__body-content').text # 获取文献的来源和日期、文献类型等 text = div.find_element_by_class_name('c-company__body-name').text.split() if (len(text) == 3 and text[-1] == '优先') or len(text) == 2: # 来源 source = text[0] # 日期 datetime = text[1] # 文献类型 literature_type = None else: source = text[0] datetime = text[2] literature_type = text[1] # 获取下载数和被引数 temp = div.find_element_by_class_name('c-company__body-info').text.split() # 下载数 download = temp[0].split(':')[-1] # 被引数 cite = temp[1].split(':')[-1] # 声明一个字典存储数据 data_dict = {} data_dict['name'] = name data_dict['author'] = author data_dict['content'] = content data_dict['source'] = source data_dict['datetime'] = datetime data_dict['literature_type'] = literature_type data_dict['download'] = download data_dict['cite'] = cite data_list.append(data_dict) print(data_dict) # 如果Btn按钮(就是加载更多这个按钮)没有找到(就是已经到底了),就退出 if not Btn: break else: Btn.click() # 如果到了爬取的页数就退出 if count == page: break count += 1 # 延迟两秒,我们不是在攻击服务器 time.sleep(2)def main(): start_spider(eval(input('请输入要爬取的页数(如果需要全部爬取请输入0):'))) # 将数据写入json文件中 with open('data_json.json', 'a+', encoding='utf-8') as f: json.dump(data_list, f, ensure_ascii=False, indent=4) print('json文件写入完成') # 将数据写入csv文件 with open('data_csv.csv', 'w', encoding='utf-8', newline='') as f: # 表头 title = data_list[0].keys() # 声明writer对象 writer = csv.DictWriter(f, title) # 写入表头 writer.writeheader() # 批量写入数据 writer.writerows(data_list) print('csv文件写入完成')if __name__ == '__main__':    main()    

  概括:

  学术之路艰难而漫长。希望编辑器中的这个程序可以帮助你在学术道路上走得更轻松一些。希望大家多多阅读文献,多发表文献,让自己的学术工作做得更好!

  如果您对此案有任何进一步的问题或意见,请告诉我,我很乐意跟进并提出建议。

  

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线