python爬虫——使用selenium爬取知网文献相关信息

写在前面:

本文章限于交流讨论,请不要使用文章的代码去攻击别人的服务器

如侵权联系作者删除

文中的错误已经修改过来了,谢谢各位爬友指出错误

在你复制本文章代码去运行的时候,请设置延迟,给自己留一条后路

转载请注明来源,谢谢

1. 先看爬取的效果

2.

知网的反爬虫手段很强,反正我爬取pc端的时候,用selenium爬取获取不到源代码,真是气人,后来换成手机端就可以获取了,爬取手机端的操作如下。

3. 首先进入知网后,选择开发工具,建议放在右边,之后再点击图中红框的东东,然后刷新一下网页就切换到手机端了

4.进入手机端的界面如下图所示(注:记得刷新网页):

5. 这是网址

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

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

import time

import json

import 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'

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

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

# 请求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').send_keys('python')

# 输入关键字之后点击搜索

browser.find_element_by_id('btnSearch ').click()

9. 在搜索关键字之后,跳转到这个界面

10.

通过selenium的显示等待,我们可以等待一些这些信息都被加载完成了,之后在进行爬取,这样就可以避免因为元素还没有加载出来而报错,如下图我们可以知道这些信息都是在这个div标签中的,所以我们可以等待这个元素是否加载出来了

# 显示等待文献是否加载完成

WebDriverWait(browser, 1000).until(

EC.presence_of_all_elements_located(

(By.CLASS_NAME, 'g-search-body')

)

)

11. 往下面翻页可以看到有个加载更多,通过显示等待判断这个按钮是否加载出来,如果没有加载出来就点击的话,那就报错了

12. 代码,等待这个按钮加载并获取该按钮

# 显示等待加载更多按钮加载完成

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')

13. 基本的讲的差不多了,接下来就是开始获取信息了

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

15. 上面说的意思是这样的,看图,正好我们需要的信息标签都是1,3,5,7,9以此类推,所以是2*count-1

16. 剩下的就没有什么好说的了,代码注释基本都有写,完整代码附上

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

from urllib.parse import urljoin

import time

import random

import json

import 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[@class="c-company__body-item"]'.format(2*count-1))

)

)

# 获取在div标签的信息,其中format(2*count-1)是因为加载的时候有显示多少条

# 简单的说就是这些div的信息都是奇数

divs = browser.find_elements_by_xpath('//div[@id="searchlist_div"]/div[{}]/div[@class="c-company__body-item"]'.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]

# ----------2020-3-18修改----------#

# 文献链接

link = div.find_element_by_class_name('c-company-top-link').get_attribute('href')

# 拼接

link = urljoin(browser.current_url, link)

# 获取关键字(需要访问该文献,url就是上面获取到的link)

# browser.get(link) # 这行和下面那行不推荐使用,因为句柄的问题,会报错

# browser.back()

# 打印查看下未访问新窗口时的句柄

# print(browser.current_window_handle)

js = 'window.open("%s");' % link

# 每次访问链接的时候适当延迟

time.sleep(random.uniform(1, 2))

browser.execute_script(js)

# 打印查看窗口的句柄,对比看下当前的句柄是哪个

# 结果是原先窗口的句柄,而不是新打开窗口的句柄,因为和上面打印的句柄一样

# print(browser.current_window_handle)

# 切换句柄到新打开的窗口,browser.window_handles是查看全部的句柄

# browser.switch_to_window是切换句柄

browser.switch_to_window(browser.window_handles[1])

# 获取关键字(使用xpath)

key_worlds = browser.find_elements_by_xpath('//div[@class="c-card__paper-name"][contains(text(), "关键词")]/following-sibling::div[1]/a')

key_worlds = ','.join(map(lambda x: x.text, key_worlds))

# ----------2020-3-19修改----------#

# 获取文献的摘要

content = browser.find_element_by_class_name('c-card__aritcle').text

# ----------2020-3-19修改----------#

# 获取信息完之后先关闭当前窗口再切换句柄到原先的窗口

browser.close()

browser.switch_to_window(browser.window_handles[0])

# 注:切换句柄参考该文章,感谢该博主:https://blog.csdn.net/DongGeGe214/article/details/52169761

# ----------2020-3-18修改----------#

# 声明一个字典存储数据

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_dict['link'] = link

data_dict['key_worlds'] = key_worlds

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)

# 全部爬取结束后退出浏览器

browser.quit()

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()

原文链接:https://blog.csdn.net/weixin_44024393/article/details/89221821

python抓取文献关键信息,python爬虫——使用selenium爬取知网文献相关信息相关推荐

  1. layui获取input信息_python爬虫—用selenium爬取京东商品信息

    python爬虫--用selenium爬取京东商品信息 1.先附上效果图(我偷懒只爬了4页) 2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Hea ...

  2. python爬虫——用selenium爬取淘宝商品信息

    python爬虫--用selenium爬取淘宝商品信息 1.附上效果图 2.淘宝网址https://www.taobao.com/ 3.先写好头部 browser = webdriver.Chrome ...

  3. python爬虫——使用selenium爬取微博数据(一)

    python爬虫--使用selenium爬取微博数据(二) 写在前面 之前因为在组里做和nlp相关的项目,需要自己构建数据集,采用selenium爬取了几十万条微博数据,学习了很多,想在这里分享一下如 ...

  4. 爬虫之selenium爬取斗鱼网站

    爬虫之selenium爬取斗鱼网站 示例代码: from selenium import webdriver import timeclass Douyu(object):def __init__(s ...

  5. Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

  6. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  7. python爬虫:Selenium爬取B站视频标题、播放量、发布时间

    上次尝试了利用Ajax机制爬取B站视频播放量等数据(链接在下方),但是发现响应的JSON数据中没有发布时间的数据,这次决定用Selenium试一下. python爬虫:Ajax爬取B站视频标题.播放量 ...

  8. 利用python爬取天气预报_python实现天气爬虫——利用xpath爬取七天天气预报数据...

    python实现天气爬虫--利用xpath爬取七天天气预报数据 import pandas as pd import lxml import requests import csv from lxml ...

  9. winform模拟登陆网页_Python爬虫使用selenium爬取群成员信息(全自动实现自动登陆)...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

最新文章

  1. android Image zImage uImage boot.img分别是什么?个人笔记
  2. minhash算法检索相似文本_文本去重算法:Minhash/Simhash/Klongsent
  3. 记一次继承了AbstractAuthenticationProcessingFilter 的过滤器被执行了两次问题
  4. 访问CrmService遇到HTTP status 401 Unauthorized的问题
  5. python中mean算函数吗_Python numpy.mean函数方法的使用
  6. spring系统学习:day4--Spring工厂
  7. word流程图怎么做虚线框_word虚线框怎么打 word中目录虚线怎么打?
  8. 自定义B站视频播放速度
  9. AIX虚拟内存管理机制(转)
  10. Cadence OrCAD Capture 绘制总线的方法
  11. 按规定顺序输出26个字母
  12. openlayers地图实现地点标注
  13. C语言中entry用法,Tkinter模块(3)-Entry
  14. 4月22 mysql常用函数
  15. Android安卓集成融云推送踩坑
  16. Mac 新系统安装CocoaPods
  17. Jmeter学习文档/使用
  18. java前端提示反射型xss_搜索框反射型xss问题解决(网站开发)
  19. Inventor API:后绑定访问一些Inventor API对象
  20. sas 导入csv文件_SAS导入导出时编码问题汇总

热门文章

  1. PS常用快捷键及技巧总结
  2. HTML中怎么去掉table中th的默认粗体
  3. facebook评论采集开发
  4. 基于51单片机智能台灯pwm调光强光控方案原理图设计
  5. 网络游戏线上活动的类型及特点(二)
  6. 科技不总是冷冰冰,智能便携打印机让文字更有温度!——嵌入式功能实现篇
  7. 二维物体形状识别方法(二)
  8. 【小李木耳】出品:你可能不知道的人生! 20110417于东北老家
  9. 关于公共JS缓存问题
  10. 从TwitterScan项目看代理合约的使用