2023年6月21日发(作者:)

Python爬⾍,批量获取知⽹⽂献信息⼀、前⾔最近临近毕业,写毕业论⽂需要从知⽹查找⼤量的⽂献。但去知⽹⼀条⼀条进去看摘要⼜略显⿇烦和浪费时间。于是,反⼿写⼀个爬⾍,批量获取基本信息,岂不美哉?在开始这个项⽬之前,我抱着不重复造轮⼦的⼼态,寻思着去Github先找找。结果发现基本上都是⼏年前的项⽬,现在早已不能使⽤。最后证实了,靠别⼈不如靠⾃⼰,撸起袖⼦就开⼲!1. 爬⾍基础⽹络爬⾍就是模拟浏览器发送⽹络请求,接收请求响应,⼀种按照⼀定的规则,⾃动地抓取互联⽹信息的程序。⽬前爬⾍主要分为以 requests 库为代表的模拟请求类爬⾍和以 selenium 为代表的模拟浏览器⽤户⾏为的爬⾍两类。:Requests 是⽤Python语⾔编写,基于 urllib,采⽤ Apache2 Licensed 开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜ HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中⼼开发的,所以它⽐ urllib 更加 Pythoner。Selenium 是⼀个⽤于Web应⽤程序测试的⼯具。Selenium测试直接运⾏在浏览器中,就像真正的⽤户在操作⼀样。⽀持的浏览器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。中国知⽹作为国内最知名的⽂献数据库之⼀,有着复杂的反爬⾍机制,包括:动态JS、iframe、验证码等等。直接模拟请求难度较⼤,且容易被封IP地址,所以本⽂主要介绍如何使⽤Selenium来爬取知⽹。2. Selenium基本⽤法声明浏览器对象Selenium⽀持⾮常多的浏览器,如Chrome、Firefox、Edge等,我们只要⾸先下载好相应浏览器的webdriver到python主⽬录中,或者加⼊环境变量即可。不同浏览器的初始化:from selenium import webdriverbrowser = ()browser = x()browser = ()browser = ()访问页⾯我们可以⽤get()⽅法来请求⼀个⽹页,传⼊参数链接('')查找元素find_element_by_id()find_element_by_name()find_element_by_class_name()find_element_by_tag_name()find_element_by_link_text()find_element_by_partial_link_text()find_element_by_xpath()find_element_by_css_selector()在element变成elements就是找所有满⾜的条件,返回数组。另外,我经常使⽤的查找元素⽅法为selenium中的By, 联合隐⼠等待EC⽤法如下:# 单个元素WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"") ) )# 多个元素WebDriverWait( driver, 10 ).until( ce_of_all_elements_located( (_NAME ,"fz14") ) )# 元素类型有:CLASS_NAME = 'class name'CSS_SELECTOR = 'css selector'ID = 'id'LINK_TEXT = 'link text'NAME = 'name'PARTIAL_LINK_TEXT = 'partial link text'TAG_NAME = 'tag name'XPATH = 'xpath'常⽤⽅法在找到相应元素位置后,我们常⽤的交互动作包括:点击、输⼊、清楚、获取属性、获取⽂本等element = find_element_by_id(''id)_keys('Hello') # 传⼊() # 清除输⼊框() # 点击元素 # 获取元素⽂本信息_attribute('href') # 获取元素属性还有⼤量的⽅法这⾥没有提及,不过有了以上基本知识,我们就可以开始项⽬了!⼆、知⽹爬⾍实战1. 知⽹页⾯元素分析知⽹⾸页中,我们仅需要先在输⼊框中键⼊主题词,然后点击搜索图标,即可跳转到结果页⾯。我们通过浏览器的检查页⾯,得到输⼊框和搜索图标的XPATH分别为:input_xpath = '/html[1]/body[1]/div[1]/div[2]/div[1]/div[1]/input[1]'button_xpath = '/html[1]/body[1]/div[1]/div[2]/div[1]/div[1]/input[2]'我们只需要在输⼊框键⼊我们要搜索的主题,然后操作搜索按钮即可转到结果页。以搜索Python为例,结果页如下所⽰,共找到15,925条,300页。每页中包含20个条⽬,每个条⽬包含题⽬、作者、来源等信息。通过对当前页⾯分析,发现每个条⽬对应的的xpath的规律。/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[1]/td[2]即倒数第⼆个标签数字代表本页的第⼏个条⽬,最后⼀个标签 2 - 6 分别代表题⽬、作者、来源、发表时间和数据库。我们在当前页⾯⽆法或者⽂献的摘要信息,下载链接等等,需要进⼀步点击进⼊相关⽂献条⽬。进⼊详情页⾯后,我们根据class name:abstract-text 能够很容易定位到摘要的⽂本,class name: btn-dlcaj 定位到下载链接,其他元素同理。完成以上知⽹页⾯的分析后,我们就可以根据需求开始写代码了!2. 代码⽰例引⽤所需要的包import time

from selenium import webdriverfrom import WebDriverWaitfrom t import expected_conditions as ECfrom import Byfrom d_capabilities import DesiredCapabilitiesfrom import urljoin创建浏览器对象这⾥我们创建⼀个Chrome浏览器的窗⼝,并设置相关参数:#get直接返回,不再等待界⾯加载完成desired_capabilities = desired_capabilities["pageLoadStrategy"] = "none"# 设置⾕歌驱动器的环境options = Options()# 设置chrome不加载图⽚,提⾼速度_experimental_option("prefs", {"d_default_content_": 2})# 设置不显⽰窗⼝#_argument('--headless')# 创建⼀个⾕歌驱动器driver = (options=options)# 设置搜索主题theme = "Python"# 设置所需篇数papers_need = 100打开页⾯并搜索关键词# 打开页⾯("")# 传⼊关键字WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,'''//*[@id="txt_SearchText"]''') ) ).send_keys(theme)# 点击搜索WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,"/html/body/div[1]/div[2]/div/div[1]/input[2]") ) ).click()(3)# 点击切换中⽂⽂献WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,"/html/body/div[5]/div[1]/div/div/div/a[1]") ) ).click()(1)# 获取总⽂献数和页数res_unm = WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,"/html/body/div[5]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em") ) ).text# 去除千分位⾥的逗号res_unm = int(res_e(",",''))page_unm = int(res_unm/20) + 1print(f"共找到 {res_unm} 条结果, {page_unm} 页。")解析结果页# 赋值序号, 控制爬取的⽂章数量count = 1# 当,爬取数量⼩于需求时,循环⽹页页码while count <= papers_need: # 等待加载完全,休眠3S (3) title_list = WebDriverWait( driver, 10 ).until( ce_of_all_elements_located( (_NAME ,"fz14") ) ) # 循环⽹页⼀页中的条⽬

for i in range(len(title_list)): try: term = count%20 # 本页的第⼏个条⽬ title_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[2]" author_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[3]" source_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[4]" date_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[5]" database_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[6]" title = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,title_xpath) ) ).text authors = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,author_xpath) ) ).text source = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,source_xpath) ) ).text date = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,date_xpath) ) ).text database = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,database_xpath) ) ).text

# 点击条⽬ title_list[i].click() # 获取driver的句柄 n = _handles

# driver切换⾄最新⽣产的页⾯ _to_window(n[-1])

# 开始获取页⾯信息 # title = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h1") ) ).text # authors = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h3[1]") ) ).text institute = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"/html[1]/body[1]/div[2]/div[1]/div[3]/div[1]/div[1]/div[3]/div[1]/h3[2]") ) ).text abstract = WebDriverWait( driver, 10 ).until( ce_of_element_located((_NAME ,"abstract-text") ) ).text try: keywords = WebDriverWait( driver, 10 ).until( ce_of_element_located((_NAME ,"keywords") ) ).text[:-1] except: keywords = '⽆' url = t_url # 获取下载链接

# link = WebDriverWait( driver, 10 ).until( ce_of_all_elements_located((_NAME ,"btn-dlcaj") ) )[0].get_attribute('href') # link = urljoin(t_url, link) # 写⼊⽂件 res = f"{count}t{title}t{authors}t{institute}t{date}t{source}t{database}t{keywords}t{abstract}t{url}".replace("n","")+"n" print(res) with open('CNKI_', 'a', encoding='gbk') as f: (res) except: print(f" 第{count} 条爬取失败n") # 跳过本条,接着下⼀个 continue finally: # 如果有多个窗⼝,关闭第⼆个窗⼝, 切换回主页 n2 = _handles if len(n2) > 1: () _to_window(n2[0]) # 计数,判断需求是否⾜够 count += 1 if count == papers_need:break

# 切换到下⼀页 WebDriverWait( driver, 10 ).until( ce_of_element_located( ( ,"//a[@id='PageNext']") ) ).click()# 关闭浏览器()结果展⽰结果是⼀个以制表符分隔的表格⽂件,其中包含了论⽂的基本信息,包括:题⽬、作者、来源、摘要、链接等三、遇到的⼀些坑1. ⽹页加载太慢导致元素查找出错1. ⽹页加载太慢导致元素查找出错有时候我们并不需要⽹页完全,我们想要的信息已经加载出来,于是加上以下设置:#get直接返回,不再等待界⾯加载完成desired_capabilities = desired_capabilities["pageLoadStrategy"] = "none"另⼀⽅⾯,在适当的地⽅加上 (3) 延时⼏秒,既可以等待页⾯加载,也可以防⽌爬取太快被封IP。2. 编码不同导致的⽂件写⼊失败在写⼊⽂件时,由于存在不同的编码,常常导致⽂件写⼊失败,在最开始我转换编码为 utf-8 ,后来发现这个编码在excel⾥⾯居然是乱码,于是改为 gbk 编码。with open('CNKI_', 'a', encoding='gbk') as f: (res)3. xpath 地址经常发⽣改变由于知⽹中包含着不同类型的⽂献,如期刊、硕博、会议、专利 等,xpath的位置不是⼀成不变的,虽然xpath唯⼀定位的特性便于我们找到相应的标签。但偶尔class name 或许是更好的选择。四、后记在数据分析中,往往花费时间的事数据的获取和数据清洗,怎样从互联⽹海量的数据中⾼效获取我们想要的部分?⽆疑⽹络爬⾍是最佳的选择之⼀。学习好爬⾍的相关库的运⽤,不论是从或联⽹上获取相关的数据,还是设置某些东东提交任务,甚⾄是写⼀些抢票软件都不是什么困难的事情。另⼀⽅⾯,爬⾍与⽹站的反爬系统⼀直都是攻防的双⽅,Selenium 这类软件能够直接模拟浏览器操作,进⽽绕过⼀些反爬机制,但并不是不能够被⽹站识别。在真实的情况中,我们往往需要结合多种⼿段爬取⽹页。在这场爬⾍和反爬⾍的军备竞赛中;在⼈与计算机的竞赛中,我们只有不断地学习新的东西,才能在这场进化中不被淘汰。

2023年6月21日发(作者:)

Python爬⾍,批量获取知⽹⽂献信息⼀、前⾔最近临近毕业,写毕业论⽂需要从知⽹查找⼤量的⽂献。但去知⽹⼀条⼀条进去看摘要⼜略显⿇烦和浪费时间。于是,反⼿写⼀个爬⾍,批量获取基本信息,岂不美哉?在开始这个项⽬之前,我抱着不重复造轮⼦的⼼态,寻思着去Github先找找。结果发现基本上都是⼏年前的项⽬,现在早已不能使⽤。最后证实了,靠别⼈不如靠⾃⼰,撸起袖⼦就开⼲!1. 爬⾍基础⽹络爬⾍就是模拟浏览器发送⽹络请求,接收请求响应,⼀种按照⼀定的规则,⾃动地抓取互联⽹信息的程序。⽬前爬⾍主要分为以 requests 库为代表的模拟请求类爬⾍和以 selenium 为代表的模拟浏览器⽤户⾏为的爬⾍两类。:Requests 是⽤Python语⾔编写,基于 urllib,采⽤ Apache2 Licensed 开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜ HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中⼼开发的,所以它⽐ urllib 更加 Pythoner。Selenium 是⼀个⽤于Web应⽤程序测试的⼯具。Selenium测试直接运⾏在浏览器中,就像真正的⽤户在操作⼀样。⽀持的浏览器包括IE,Mozilla Firefox,Safari,Google Chrome,Opera等。中国知⽹作为国内最知名的⽂献数据库之⼀,有着复杂的反爬⾍机制,包括:动态JS、iframe、验证码等等。直接模拟请求难度较⼤,且容易被封IP地址,所以本⽂主要介绍如何使⽤Selenium来爬取知⽹。2. Selenium基本⽤法声明浏览器对象Selenium⽀持⾮常多的浏览器,如Chrome、Firefox、Edge等,我们只要⾸先下载好相应浏览器的webdriver到python主⽬录中,或者加⼊环境变量即可。不同浏览器的初始化:from selenium import webdriverbrowser = ()browser = x()browser = ()browser = ()访问页⾯我们可以⽤get()⽅法来请求⼀个⽹页,传⼊参数链接('')查找元素find_element_by_id()find_element_by_name()find_element_by_class_name()find_element_by_tag_name()find_element_by_link_text()find_element_by_partial_link_text()find_element_by_xpath()find_element_by_css_selector()在element变成elements就是找所有满⾜的条件,返回数组。另外,我经常使⽤的查找元素⽅法为selenium中的By, 联合隐⼠等待EC⽤法如下:# 单个元素WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"") ) )# 多个元素WebDriverWait( driver, 10 ).until( ce_of_all_elements_located( (_NAME ,"fz14") ) )# 元素类型有:CLASS_NAME = 'class name'CSS_SELECTOR = 'css selector'ID = 'id'LINK_TEXT = 'link text'NAME = 'name'PARTIAL_LINK_TEXT = 'partial link text'TAG_NAME = 'tag name'XPATH = 'xpath'常⽤⽅法在找到相应元素位置后,我们常⽤的交互动作包括:点击、输⼊、清楚、获取属性、获取⽂本等element = find_element_by_id(''id)_keys('Hello') # 传⼊() # 清除输⼊框() # 点击元素 # 获取元素⽂本信息_attribute('href') # 获取元素属性还有⼤量的⽅法这⾥没有提及,不过有了以上基本知识,我们就可以开始项⽬了!⼆、知⽹爬⾍实战1. 知⽹页⾯元素分析知⽹⾸页中,我们仅需要先在输⼊框中键⼊主题词,然后点击搜索图标,即可跳转到结果页⾯。我们通过浏览器的检查页⾯,得到输⼊框和搜索图标的XPATH分别为:input_xpath = '/html[1]/body[1]/div[1]/div[2]/div[1]/div[1]/input[1]'button_xpath = '/html[1]/body[1]/div[1]/div[2]/div[1]/div[1]/input[2]'我们只需要在输⼊框键⼊我们要搜索的主题,然后操作搜索按钮即可转到结果页。以搜索Python为例,结果页如下所⽰,共找到15,925条,300页。每页中包含20个条⽬,每个条⽬包含题⽬、作者、来源等信息。通过对当前页⾯分析,发现每个条⽬对应的的xpath的规律。/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[1]/td[2]即倒数第⼆个标签数字代表本页的第⼏个条⽬,最后⼀个标签 2 - 6 分别代表题⽬、作者、来源、发表时间和数据库。我们在当前页⾯⽆法或者⽂献的摘要信息,下载链接等等,需要进⼀步点击进⼊相关⽂献条⽬。进⼊详情页⾯后,我们根据class name:abstract-text 能够很容易定位到摘要的⽂本,class name: btn-dlcaj 定位到下载链接,其他元素同理。完成以上知⽹页⾯的分析后,我们就可以根据需求开始写代码了!2. 代码⽰例引⽤所需要的包import time

from selenium import webdriverfrom import WebDriverWaitfrom t import expected_conditions as ECfrom import Byfrom d_capabilities import DesiredCapabilitiesfrom import urljoin创建浏览器对象这⾥我们创建⼀个Chrome浏览器的窗⼝,并设置相关参数:#get直接返回,不再等待界⾯加载完成desired_capabilities = desired_capabilities["pageLoadStrategy"] = "none"# 设置⾕歌驱动器的环境options = Options()# 设置chrome不加载图⽚,提⾼速度_experimental_option("prefs", {"d_default_content_": 2})# 设置不显⽰窗⼝#_argument('--headless')# 创建⼀个⾕歌驱动器driver = (options=options)# 设置搜索主题theme = "Python"# 设置所需篇数papers_need = 100打开页⾯并搜索关键词# 打开页⾯("")# 传⼊关键字WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,'''//*[@id="txt_SearchText"]''') ) ).send_keys(theme)# 点击搜索WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,"/html/body/div[1]/div[2]/div/div[1]/input[2]") ) ).click()(3)# 点击切换中⽂⽂献WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,"/html/body/div[5]/div[1]/div/div/div/a[1]") ) ).click()(1)# 获取总⽂献数和页数res_unm = WebDriverWait( driver, 100 ).until( ce_of_element_located( ( ,"/html/body/div[5]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em") ) ).text# 去除千分位⾥的逗号res_unm = int(res_e(",",''))page_unm = int(res_unm/20) + 1print(f"共找到 {res_unm} 条结果, {page_unm} 页。")解析结果页# 赋值序号, 控制爬取的⽂章数量count = 1# 当,爬取数量⼩于需求时,循环⽹页页码while count <= papers_need: # 等待加载完全,休眠3S (3) title_list = WebDriverWait( driver, 10 ).until( ce_of_all_elements_located( (_NAME ,"fz14") ) ) # 循环⽹页⼀页中的条⽬

for i in range(len(title_list)): try: term = count%20 # 本页的第⼏个条⽬ title_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[2]" author_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[3]" source_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[4]" date_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[5]" database_xpath = f"/html[1]/body[1]/div[5]/div[2]/div[2]/div[2]/form[1]/div[1]/table[1]/tbody[1]/tr[{term}]/td[6]" title = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,title_xpath) ) ).text authors = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,author_xpath) ) ).text source = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,source_xpath) ) ).text date = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,date_xpath) ) ).text database = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,database_xpath) ) ).text

# 点击条⽬ title_list[i].click() # 获取driver的句柄 n = _handles

# driver切换⾄最新⽣产的页⾯ _to_window(n[-1])

# 开始获取页⾯信息 # title = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h1") ) ).text # authors = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"/html/body/div[2]/div[1]/div[3]/div/div/div[3]/div/h3[1]") ) ).text institute = WebDriverWait( driver, 10 ).until( ce_of_element_located(( ,"/html[1]/body[1]/div[2]/div[1]/div[3]/div[1]/div[1]/div[3]/div[1]/h3[2]") ) ).text abstract = WebDriverWait( driver, 10 ).until( ce_of_element_located((_NAME ,"abstract-text") ) ).text try: keywords = WebDriverWait( driver, 10 ).until( ce_of_element_located((_NAME ,"keywords") ) ).text[:-1] except: keywords = '⽆' url = t_url # 获取下载链接

# link = WebDriverWait( driver, 10 ).until( ce_of_all_elements_located((_NAME ,"btn-dlcaj") ) )[0].get_attribute('href') # link = urljoin(t_url, link) # 写⼊⽂件 res = f"{count}t{title}t{authors}t{institute}t{date}t{source}t{database}t{keywords}t{abstract}t{url}".replace("n","")+"n" print(res) with open('CNKI_', 'a', encoding='gbk') as f: (res) except: print(f" 第{count} 条爬取失败n") # 跳过本条,接着下⼀个 continue finally: # 如果有多个窗⼝,关闭第⼆个窗⼝, 切换回主页 n2 = _handles if len(n2) > 1: () _to_window(n2[0]) # 计数,判断需求是否⾜够 count += 1 if count == papers_need:break

# 切换到下⼀页 WebDriverWait( driver, 10 ).until( ce_of_element_located( ( ,"//a[@id='PageNext']") ) ).click()# 关闭浏览器()结果展⽰结果是⼀个以制表符分隔的表格⽂件,其中包含了论⽂的基本信息,包括:题⽬、作者、来源、摘要、链接等三、遇到的⼀些坑1. ⽹页加载太慢导致元素查找出错1. ⽹页加载太慢导致元素查找出错有时候我们并不需要⽹页完全,我们想要的信息已经加载出来,于是加上以下设置:#get直接返回,不再等待界⾯加载完成desired_capabilities = desired_capabilities["pageLoadStrategy"] = "none"另⼀⽅⾯,在适当的地⽅加上 (3) 延时⼏秒,既可以等待页⾯加载,也可以防⽌爬取太快被封IP。2. 编码不同导致的⽂件写⼊失败在写⼊⽂件时,由于存在不同的编码,常常导致⽂件写⼊失败,在最开始我转换编码为 utf-8 ,后来发现这个编码在excel⾥⾯居然是乱码,于是改为 gbk 编码。with open('CNKI_', 'a', encoding='gbk') as f: (res)3. xpath 地址经常发⽣改变由于知⽹中包含着不同类型的⽂献,如期刊、硕博、会议、专利 等,xpath的位置不是⼀成不变的,虽然xpath唯⼀定位的特性便于我们找到相应的标签。但偶尔class name 或许是更好的选择。四、后记在数据分析中,往往花费时间的事数据的获取和数据清洗,怎样从互联⽹海量的数据中⾼效获取我们想要的部分?⽆疑⽹络爬⾍是最佳的选择之⼀。学习好爬⾍的相关库的运⽤,不论是从或联⽹上获取相关的数据,还是设置某些东东提交任务,甚⾄是写⼀些抢票软件都不是什么困难的事情。另⼀⽅⾯,爬⾍与⽹站的反爬系统⼀直都是攻防的双⽅,Selenium 这类软件能够直接模拟浏览器操作,进⽽绕过⼀些反爬机制,但并不是不能够被⽹站识别。在真实的情况中,我们往往需要结合多种⼿段爬取⽹页。在这场爬⾍和反爬⾍的军备竞赛中;在⼈与计算机的竞赛中,我们只有不断地学习新的东西,才能在这场进化中不被淘汰。