【毕设】selenium 爬取知网作者信息

步骤:

  1. 获取网页url
  2. 解析网页,发现网页大部分内容存储在了iframe标签中
  3. 通过selenium获取信息并保存到CSV文件中
  4. 更多源码已放置码云
import csv

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, WebDriverException


class Author:
    name = ''
    school = ''
    major = ''
    sum_public = ''
    sum_download = ''
    fields = []
    articles = []
    teacher = ''
    students = []

    def __init__(self,
                 url="https://kns.cnki.net/kcms/detail/knetsearch.aspx?dbcode=CMFD&sfield=au&skey=%e8%82%96%e7%9b%b8%e6%ac%a3&code=42962547&v=XuuQ%25mmd2Fi3qrWQVFULCjpwXoY%25mmd2BbZqrZ3W7KIDLXBs226SGLHyEOO6LJv4PgXwW%25mmd2BwxsG "):
        print("开始爬取作者信息")
        self.driver = webdriver.Chrome()
        print("正在打开浏览器。。")
        self.driver.get(url)
        print("全局等待时间设置为3秒")
        self.driver.implicitly_wait(3)
        print("窗口最大化")
        self.driver.maximize_window()

    def crawl_main(self):
        """
        爬取主要信息:姓名,学校,专业,总发文量,总下载量
        """
        name_tag = self.driver.find_element_by_tag_name("h1")
        school_tag = self.driver.find_element_by_xpath("//div/h3[1]")
        major_tag = self.driver.find_element_by_xpath("//div/h3[2]")
        sum_public_tag = self.driver.find_element_by_xpath('//h5/em[1]')
        sum_download_tag = self.driver.find_element_by_xpath('//h5/em[2]')
        self.name = name_tag.text if name_tag else ""
        self.school = school_tag.text if school_tag else ""
        self.major = major_tag.text if major_tag else ""
        self.sum_public = sum_public_tag.text if sum_public_tag else ""
        self.sum_download = sum_download_tag.text if sum_download_tag else ""
        print("【作者信息】{0: ^12} 爬取成功!".format(self.name))

    def crawl_fields(self):
        """爬取作者关注领域"""
        try:
            # 跳回原框架
            self.driver.switch_to.default_content()
            self.driver.switch_to.frame("frame1")
            listcon_tag = self.driver.find_element_by_class_name('listcont')
            lis = listcon_tag.find_elements_by_tag_name('li')
            for li in lis:
                self.fields.append(li.text)
                print("【关注领域】{0: <12} 爬取成功!".format(li.text))
        except NoSuchElementException:
            print("作者无关注领域!")
        except WebDriverException:
            print("进入框架frame1异常!")

    def crawl_articles(self):
        """爬取作者的文献"""
        try:
            # 跳回原框架
            self.driver.switch_to.default_content()
            self.driver.switch_to.frame("frame2")
            ul_tag = self.driver.find_element_by_xpath("//div/ul")
            lis = ul_tag.find_elements_by_tag_name('li')
            for li in lis:
                temp = li.find_element_by_tag_name('a').text
                self.articles.append(temp)
                print("【作者文献】{0: <20} 爬取成功!".format(temp))
        except NoSuchElementException:
            print("作者无文献!")
        except WebDriverException:
            print("进入框架frame2异常!")

    def crawl_teacher(self):
        """爬取作者导师"""
        try:
            # 跳回原框架
            self.driver.switch_to.default_content()
            self.driver.switch_to.frame("frame9")
            name_tag = self.driver.find_element_by_class_name('name')
            self.teacher = name_tag.text
            print("【作者导师】{0: <12} 爬取成功!".format(self.teacher))
        except NoSuchElementException:
            print("作者无导师!")
        except WebDriverException:
            print("进入框架frame9异常!")

    def crawl_students(self):
        """爬取作者学生"""
        try:
            self.driver.switch_to.default_content()
            self.driver.switch_to.frame("frame12")
            listcon_tag = self.driver.find_element_by_class_name('listcont')
            lis = listcon_tag.find_elements_by_tag_name('li')
            for li in lis:
                self.students.append(li.text)
                print("【作者学生】{0: <12} 爬取成功!".format(li.text))
        except NoSuchElementException:
            print("作者无学生!")
        except WebDriverException:
            print("进入框架frame12异常!")

    def close_driver(self):
        """关闭当前页面"""
        self.driver.close()

    def save_csv(self, f):
        """存储到csv文件中"""
        self.crawl_main()
        self.crawl_fields()
        self.crawl_articles()
        self.crawl_teacher()
        self.crawl_students()
        f_csv = csv.writer(f)
        f_csv.writerow((self.name, self.school, self.major, self.sum_public, self.sum_download, self.fields,self.articles, self.teacher, self.students))
        self.close_driver()

使用Python的requests库爬取中国知网(CNKI)的内容需要特别注意,因为知网通常有反爬机制并且限制了非注册用户的数据访问权限。以下是一个简单的步骤概述: 1. **安装requests库**:首先确保已经安装了`requests`库,如果没有,可以运行 `pip install requests`。 2. **模拟请求头**:知网可能会检查请求头以判断是否是合法的用户访问。你需要设置一些基本的User-Agent,例如浏览器版本,以及可能需要的Cookie,以尽可能地模拟正常浏览器访问。 ```python import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', # 可能需要的Cookie值,具体要看知网的要求 } ``` 3. **处理反爬机制**:知网可能会通过验证码、IP限制等方式阻止直接爬虫。如果遇到这种情况,可能需要使用代理IP、Selenium配合ChromeDriver动态渲染页面获取验证码,或者考虑使用专业的数据抓取工具如Scrapy。 4. **API访问**:若知网提供API服务,可以直接调用API获取数据。然而,大部分学术资源并不开放API,对于论文等详细信息,直接爬取网页内容可能更常见。 5. **遵守规定**:在爬取任何网站时,务必遵守相关法律法规和网站的Robots协议,尊重版权,不要进行大规模、频繁的爬取,以免触发封禁。 由于知网的具体反爬策略可能会改变,以上信息仅供参考,实际操作前应先了解最新的政策和技术限制。同时,很多敏感数据可能无法轻易获取到。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值