关于文章《爬取知网文献信息》中代码的一些优化

这篇具有很好参考价值的文章主要介绍了关于文章《爬取知网文献信息》中代码的一些优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

 

之前写了一篇关于文献爬虫的文章Python爬虫实战(5) | 爬取知网文献信息

 

文章发布之后有很多小伙伴给出了一些反馈和指正,在认真看了小伙伴们的留言之后,咸鱼对代码进行了一些优化

 

优化的代码在文末,欢迎各位小伙伴给出意见和指正

 

问题

  • pycharm 设置 Edge 驱动器的环境报错“module 'selenium.webdriver' has no attribute 'EdgeOptions”

如果浏览器驱动已经下载,而放在了合适的位置(比如添加到环境变量里,或者放在了 python.exe 同级目录中)

 

那就可能是因为你使用的是较老的版本,Edge的选项已经被更新了。 建议更新 selenium 包以获得最佳的Edge选项支持

 

可以通过以下命令更新 selenium,建议更新到 4.6 以上版本

pip install -U selenium

 

因为 selenium 4.6 版本之后内置了一个组件:Selenium Manager

 

根据官网介绍,这个 Selenium Manager 可以帮助你获得一个运行 Selenium 的开箱即用的环境

 

如果在 PATH 中没有找到 Chrome、Firefox 和 Edge 的驱动,Selenium Manager的 Beta 1版将为它们配置。不需要额外的配置

 

这就意味着自己不需要再去下载安装浏览器驱动

关于文章《爬取知网文献信息》中代码的一些优化

 

中文文档链接:

https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/install_drivers/

 

  • 只能爬取20倍数的文献篇数

有位粉丝发现每次爬取都是爬取 20 倍数的文献篇数(20、40、60)。假设要爬取 21 篇,但是却爬到了 40 篇

 

排查的时候发现是代码中的逻辑有一些 bug ,已经优化

 

  • 获取不到网页的 xpath 元素

第一种可能是网页中的 xpath 元素并不是一成不变的,要参考自己的浏览器上的 Xpath。在我这可能是div[3],在你那可能就不是这个了,所以说需要自己先定位一遍

 

第二种可能是网页加载太慢导致爬虫爬取不到,这种情况的话可以增加等待超时时间

 

  • 关于网页加载太慢导致程序爬取不到元素报超时异常或者元素不存在异常

我的代码中用的都是显示等待 + 强制等待结合的方式。如果还是不行,小伙伴们可以自行设置超时时间

 

优化后代码

关于文章《爬取知网文献信息》中代码的一些优化

 

 

下面给出优化后的源码

import time
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 selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from urllib.parse import urljoin
​
​
def open_page(driver, theme):
    # 打开页面
    driver.get("https://www.cnki.net")
​
    # 传入关键字
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, '''//*[@id="txt_SearchText"]'''))).send_keys(theme)
​
    # 点击搜索
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/div[2]/div/div[1]/input[2]"))).click()
    time.sleep(3)
​
    # 点击切换中文文献
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[3]/div[1]/div/div/div/a[1]"))).click()
    time.sleep(3)
​
    # 获取总文献数和页数
    res_unm = WebDriverWait(driver, 100).until(EC.presence_of_element_located(
        (By.XPATH, "/html/body/div[3]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em"))).text
​
    # 去除千分位里的逗号
    res_unm = int(res_unm.replace(",", ''))
    page_unm = int(res_unm / 20) + 1
    print(f"共找到 {res_unm} 条结果, {page_unm} 页。")
    return res_unm
​
​
def crawl(driver, papers_need, theme):
    # 赋值序号, 控制爬取的文章数量
    count = 1# 当爬取数量小于需求时,循环网页页码
    while count <= papers_need:
        # 等待加载完全,休眠3S
        time.sleep(3)
​
        title_list = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "fz14")))
        # 循环网页一页中的条目
        for i in range(len(title_list)):
            try:
                if (count % 20) != 0:
                    term = count % 20  # 本页的第几个条目
                else:
                    term = 20
                title_xpath = f"/html/body/div[3]/div[2]/div[2]/div[2]/form/div/table/tbody/tr[{term}]/td[2]"
                author_xpath = f"/html/body/div[3]/div[2]/div[2]/div[2]/form/div/table/tbody/tr[{term}]/td[3]"
                source_xpath = f"/html/body/div[3]/div[2]/div[2]/div[2]/form/div/table/tbody/tr[{term}]/td[4]"
                date_xpath = f"/html/body/div[3]/div[2]/div[2]/div[2]/form/div/table/tbody/tr[{term}]/td[5]"
                database_xpath = f"/html/body/div[3]/div[2]/div[2]/div[2]/form/div/table/tbody/tr[{term}]/td[6]"
                title = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, title_xpath))).text
                authors = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, author_xpath))).text
                source = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, source_xpath))).text
                date = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, date_xpath))).text
                database = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.XPATH, database_xpath))).text
​
                # 点击条目
                title_list[i].click()
​
                # 获取driver的句柄
                n = driver.window_handles
​
                # driver切换至最新生产的页面
                driver.switch_to.window(n[-1])
                time.sleep(3)
​
                # 开始获取页面信息
                title = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h1"))).text
                authors = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h3[1]"))).text
                institute = WebDriverWait(driver, 10).until(EC.presence_of_element_located(
                    (By.XPATH, "/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h3[2]"))).text
                abstract = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.CLASS_NAME, "abstract-text"))).text
                try:
                    keywords = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((By.CLASS_NAME, "keywords"))).text[:-1]
                    cssci = WebDriverWait(driver, 10).until(
                        EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/div[1]/div[3]/div/div/div[1]/div[1]/a[2]"))).text
                except:
                    keywords = ''
                    cssci = 'NULL'
                url = driver.current_url
​
                res = f"{count}\t{title}\t{authors}\t{cssci}\t{institute}\t{date}\t{source}\t{database}\t{keywords}\t{abstract}\t{url}".replace(
                        "\n", "") + "\n"
                print(res)
                
                '''写入文件,有需要的小伙伴可以去掉注释'''
                # with open(f'CNKI_{theme}.tsv', 'a', encoding='gbk') as f:
                #     f.write(res)
except:
                print(f" 第{count} 条爬取失败\n")
                # 跳过本条,接着下一个
                continue
            finally:
                # 如果有多个窗口,关闭第二个窗口, 切换回主页
                n2 = driver.window_handles
                if len(n2) > 1:
                    driver.close()
                    driver.switch_to.window(n2[0])
                # 爬完一篇计数加 1
                count += 1if count > papers_need:
                    break
                    
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//a[@id='PageNext']"))).click()
​
​
if __name__ == "__main__":
    print("开始爬取!")
​
    # get直接返回,不再等待界面加载完成
    desired_capabilities = DesiredCapabilities.CHROME
    desired_capabilities["pageLoadStrategy"] = "none"# 设置驱动器的环境
    options = webdriver.EdgeOptions()
​
    # 设置chrome不加载图片,提高速度
    options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
​
    # 设置不显示窗口
    options.add_argument('--headless')
​
    # 创建一个浏览器驱动器
    driver = webdriver.Edge(options=options)
​
    # 输入需要搜索的主题
    # theme = input("请输入你要搜索的期刊名称:")
    theme = "python"# 设置所需篇数
    # papers_need = int(input("请输入你要爬取篇数:"))
    papers_need = 100
​
    res_unm = int(open_page(driver, theme))
​
    # 判断所需是否大于总篇数
    papers_need = papers_need if (papers_need <= res_unm) else res_unm
    crawl(driver, papers_need, theme)
​
    print("爬取完毕!")
​
    # 关闭浏览器
    driver.close()
​
 

 文章来源地址https://www.toymoban.com/news/detail-426708.html

到了这里,关于关于文章《爬取知网文献信息》中代码的一些优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 去除IDEA中代码的波浪线(黄色警示线)

    去除IDEA中代码的波浪线 首先是点击 File—Settings  操作如下图所示: 然后点击 Editor—Inspections—General—Duplicated code fragment(去掉勾选)—Apply—OK  即可,详情请看下图所示:

    2024年02月03日
    浏览(49)
  • 怎么使用Git查看项目中代码的提交历史记录?

    怎么使用Git查看项目中代码的提交历史记录? 可以在git上使用下面这段指令 在git上执行完之后,就可以在桌面上看到打印出来的日志文件了 Readme.log日志文件如下: 对指令中的代码进行解释: git log 是git导出指令 format 是需要导出的数据格式,这里是代码提交时间、提交人员

    2024年02月12日
    浏览(37)
  • 关于工作中爬取网站的一些思路记录

    声明:只是因为工作中需要,且基本不会对别人的网站构成什么不好的影响,做个思路记录!!! 尊重网站所有者、控制请求频率、遵守网站规则、尊重个人隐私 平常工作中难免会遇到需要爬取别人网站的需求,例如爬取兑换之类的流程,把接口爬取下来封装到项目中,这

    2024年02月07日
    浏览(42)
  • python爬虫爬取微信公众号的阅读数、喜爱数、文章标题和链接等信息

    爬虫的步骤: (1)申请自己的公众号 (2)使用fiddler抓包工具 (3)pycharm (一)申请公众号 官网:微信公众平台 填入相关信息创建微信公众号 进入公众号界面如下: 找到新的创作-图文信息 在弹出的界面中查找公众号文章-输入公众号名称-确定 点击确认之后,进入公众号

    2024年02月05日
    浏览(42)
  • 关于ES集群信息的一些查看

    查看版本 kibana : GET / GET /_cat/nodes?v 解释: ip:集群中节点的 ip 地址; heap.percent:堆内存的占用百分比; ram.percent:总内存的占用百分比,其实这个不是很准确,因为 buff/cache 和 available 也被当作使用内存; cpu:cpu 占用百分比; load_1m:1 分钟内 cpu 负载; load_5m:5 分钟内

    2023年04月11日
    浏览(26)
  • 关于信息学奥赛中的一些做题思路

    本文记录了笔者在刷题或比赛中运用到的一些做题思路 可以 适当 参考 首先显然有 (mathcal {O}(n^2)) 暴力 枚举每个子段,然后选择其中前k大的 那么可以发现有 贪心 策略: 选择k次最大值 那么考虑怎样求最大值 想到可以枚举每个起始位置,想办法计算从该位置开始符合要求

    2024年03月13日
    浏览(44)
  • 一些关于Aleo项目的误解和常见的试错信息

    在现实生活中,你不会因为买了一杯咖啡而被人知道你有多少财富,但在区块链世界,你可能会因为在opensea上买了一个便宜的NFT而被人发现你的钱包地址、所有转账信息以及钱包里的所有财富。如果被不怀好意的人或一些恶意的黑客盯上,你可能就会受到攻击,遭受很大的损

    2024年02月06日
    浏览(33)
  • Python scrapy爬取带验证码的列表数据

    首先所需要的环境:(我用的是Python2的,可以选择python3,具体遇到的问题自行解决,目前我这边几百万的数据量爬取) 环境: 直接贴代码具体需要注意的特殊颜色标出有注释 pipelines存数据库这个就不说了根据自己的业务 注:目前我网站验证码比较简单可以直接使用pytess

    2024年01月18日
    浏览(28)
  • 关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

    这篇文章是关于嵌入式开发的一些基本信息,供想入行的人参考。有一些作者本人的想法,以及来自外网的大拿的文章翻译而来,原文链接在此Learning Linux for embedded systems,再次感谢,支持原创。 普通C开发人员和嵌入式C开发人员之间的 基本区别在于 ,因为嵌入式C程序被设

    2024年02月03日
    浏览(45)
  • 爬取诗词网站中的文章

    实战准备:要爬取的url:https://www.shicimingju.com/book/sanguoyanyi.html 实战要求:爬取诗词名句网站中的三国演义文章,将每章的标题和内容写入自己的项目文件(sanguo.txt) (本次爬取使用bs4) *bas4知识梳理在博客中Python知识梳理中

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包