Python爬⾍批量下载⽂献
最近在看的⽂章,但是⼀篇篇下载太繁琐,希望能快速批量下载下来。
于是想到了之前⼀直听说的python爬⾍,初次学着弄⼀下。
参考了python爬⾍⼊门教程: ;
⽤到了requests,BeautifulSoup,quest包
先放最终运⾏的程序:
结果程序
import requests
import pandas as pd
from bs4 import BeautifulSoup
quest import urlretrieve
import os
BASE_URL = '/'
# 打开⽹站并下载
def openAndDownload(url, title):
str_subhtml = (url)
soup1 = BeautifulSoup(, 'lxml')
subdata = soup1.select('body > ainer-fluid > div > div > a:nth-child(4)')
# print('subdata:', subdata)
downloadUrl = BASE_URL + subdata[0].get('href')
print(downloadUrl)
getFile(downloadUrl, title)
# 下载⽂件
def getFile(url, title):
title = replaceIllegalStr(title)
filename = title + '.pdf'
urlretrieve(url, './essay/%s' % filename.split('/')[-1])
print("Sucessful to download " + title)
# 替换⾮法命名字符
def replaceIllegalStr(str):
str = place(':', '')
str = place('?', '')西门子plc基础知识指令27个
str = place('/', '')
str = place('\\', '')
return str
def main():
url = '/paper/2020'
strhtml = (url)
soup = , 'lxml')
data = soup.select('body > ainer-fluid > div > ul > li > a')
list = []
for item in data:
list.append([_text(), ('href')])
name = ['title', 'link']
test = pd.DataFrame(columns=name, data=list)
print(test)
<_csv('./essayList.csv')
excel webservice函数# 检查是否下载过
file_dir = os.path.wd(), 'essay')
downloaded_list = []
for root, dirs, files in os.walk(file_dir):
downloaded_list = files
for et, el in zip(test[name[0]], test[name[1]]):
essay_url = BASE_URL + el
checkname = et + '.pdf'
checkname = replaceIllegalStr(checkname)
if (checkname in downloaded_list):
print(checkname + ' has been downloaded! ')
else:
openAndDownload(essay_url, et)
if __name__ == '__main__':
main()
结果:
对于NeurIPS⽹页的⽂献批量下载编程
1. 对⽹页进⾏分析
⽬标是从NeurIPS2020会议的列表下载论⽂,2020年会议⽂章地址:
⾸先分析⽹页构成:打开⽹页后按F12调出开发者界⾯,可以看到⽹页的源码。
把⿏标放到右侧Elements代码⾥不同位置,左侧会有不同的控件⾼亮,以此到⼀篇⽂章的所在位置,如下图所⽰
python中,使⽤BeautifulSoup来打开⽹页
Beautiful Soup 是 python 的⼀个库,其最主要的功能是从⽹页中抓取数据。Beautiful Soup ⽬前已经
被移植到 bs4 库中,也就是说在导⼊ Beautiful Soup 时需要先安装 bs4 库。安装好 bs4 库以后,还需安装 lxml 库。尽管 Beautiful Soup 既⽀持 Python 标准库中的 HTML 解析器⼜⽀持⼀些第三⽅解析器 lxml 库具有功能更加强⼤、速度更快的特点。
⾸先,HTML ⽂档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段⽂档,此处指定 lxml 解析器进⾏解析。解析后便将复杂的 HTML ⽂档转换成树形结构,并且每个节点都是 Python 对象。这⾥将解析后的⽂档存储到新建的变量 soup 中
import requests
from bs4 import BeautifulSoup
url = '/paper/2020'
strhtml = (url)
soup = , 'lxml')
print(soup)
结果:
可以看到⽂献都是以某种列表的格式整齐排列。
通过BeautifulSoup的select函数将相关字段选出,select函数所需路径从开发者界⾯中使⽤Copy selector复制得到,如图所⽰:
复制得
web前端开发怎么样body > ainer-fluid > div > ul > li:nth-child(1) > a
其中li:nth-child(1),表⽰某⼀项。要获取整个列,只选li,代码结果如下:
python入门教程非常详细下载data = soup.select('body > ainer-fluid > div > ul > li > a')
print(data)
结果:
可以看到,每⼀个元素⾥⾯,有⽂章的名字和链接,正好是我们需要的。
⽂章名在标签< a >中,使⽤get_text()获取;链接在< a >标签的href属性中,使⽤get('href')获取。
将其全部提出来并保存为csv格式,以便之后查询使⽤。
alter table add column 默认值list = []
for item in data:
list.append([_text(), ('href')])
name = ['title', 'link']
test = pd.DataFrame(columns=name, data=list)
<_csv('./essaylist.csv')
结果:
2. 单个⽂件下载
恶作剧代码大全由于这个界⾯的超链接并不是⽂件的下载链接,打开后⽽是⽂章的详情页⾯:
可以从这个页⾯爬出所需要的信息如摘要等,但⽬前我们只想下载paper,因此⽤与前⽂相同的Copy selector的⽅式选出⽂件下载地址的路径:
得到
body > ainer-fluid > div > div > a:nth-child(4)
此时不再需要去除nth-child(4),因为我们只需要这⼀项。获得了链接后还得与⽹站主地址组合起来形成完整的地址:
essay_url = '/' + test['link'][0]
str_subhtml = (essay_url)
soup1 = BeautifulSoup(, 'lxml')
subdata = soup1.select('body > ainer-fluid > div > div > a:nth-child(4)')
downloadUrl = '/' + subdata[0].get('href') # 拼接成完整url
print(downloadUrl)
结果:
接下来通过urlretrieve进⾏下载操作。
filename = test['title'][0] + '.pdf' # 补全⽂件格式
urlretrieve(downloadUrl, './%s' % filename.split('/')[-1])
print("Sucessful to download: " + test['title'][0])
即可下载成功:
3. 全部⽂件下载与改错
全部⽂件的下载加个循环即可,具体如最前⾯的结果程序所⽰。
另外在运⾏过程中发现了⼀些问题:
⽂件命名问题
下载过程中某些⽂件名只有前⾯⼏个单词,且⽂件不完整。
经过观察发现,出错的是⽂章名字带有':' , '?' , '\' 或 '/' 的,这些是⽂件命名所不允许的字符,因此在程序中将这些字符替换掉。
下载重复
⽂章实在有点多,⼀次可能下不完(或者有更⾼效的批量下载⽅式)。
于是修改了程序,通过遍历本地⽂件获得下载了的⽂献列表,使⽤checkname in downloaded_list的⽅式判断⽂献是否已经下载过,避免重复下载。具体实现如最前⾯的结果程序所⽰。
待补充与改进
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论