• 1、任务简介

本次任务是爬取IJCAI(国际人工智能联合会议)最新2018年的pdf论文文件。

本次编码用到了正则表达式从html里面提取信息,如下对正则表达式匹配规则作简要的介绍。

  • 2、正则表达式规则

\w匹配字母数字及下划线

\W匹配非字母数字及下划线

\s匹配任意空白字符,等价于 [\t\n\r\f].

\S匹配任意非空字符

\d匹配任意数字,等价于 [0-9]

\D匹配任意非数字

\A匹配字符串开始

\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串

\z匹配字符串结束

\G匹配最后匹配完成的位置

\n匹配一个换行符

\t匹配一个制表符

^匹配字符串的开头

$匹配字符串的末尾

.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'

[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

*匹配0个或多个的表达式。

+匹配1个或多个的表达式。

?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式

{n}精确匹配n个前面表达式。

{n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式

a|b匹配a或b

( )匹配括号内的表达式,也表示一个组

  • 3、代码实现

第一种方法实现如下:

 # -*- coding: utf-8 -*-
"""
Created on Tue Aug 7 12:32:25 2018 @author: Lenovo
"""
import urllib.request
import re
import os url = 'http://www.ijcai.org/proceedings/2017/' def getHtml(url):
request = urllib.request.Request(url)
request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
response = urllib.request.urlopen(request)
html = response.read() return html html = getHtml(url) def getPaper(html):
if not os.path.exists('IJCAI_2017') : #文件夹不存在时,再进行创建
os.mkdir('IJCAI_2017')
os.chdir(os.path.join(os.getcwd(), 'IJCAI_2017')) reg = 'href="(\d{4}\.pdf)"' #正则表达式
papre = re.compile(reg)
addr_list = re.findall(papre, html.decode('utf-8')) num = len(addr_list)
print('论文总数:', num) m =1
for paperurl in addr_list:
fname = '%s.pdf' %m#论文下载名
paper_url = url + paperurl#论文下载地址
print(paper_url)
paper = getHtml(paper_url) with open(fname, 'wb') as f:
f.write(paper) m += 1 print('已下载')
f.close() getPaper(html)

第二种方法实现如下:

 # -*- coding: utf-8 -*-
"""
Created on Sun Aug 5 10:41:13 2018 @author: Lenovo
"""
import requests
import os
from bs4 import BeautifulSoup, Comment url = 'http://www.ijcai.org/proceedings/2018/'
headers = {'Host' : 'www.ijcai.org', 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} def find_paper():
html = requests.get(url, headers = headers).content
s = BeautifulSoup(html, 'lxml') #要爬取的信息在页面解析后的注释内,获取注释内容,结果返回所有注释列表
comments = s.find_all(text=lambda text:isinstance(text, Comment)) #论文信息为comments[2],再次使用beautifulsoup解析
soup = BeautifulSoup(comments[2], 'lxml') titles = soup.find_all("div", class_ = "title")#由于class是关键字所以加一个'_'
details = soup.find_all("div", class_ = "details") return titles, details titles, details = find_paper() def download_paper():
if not os.path.exists('IJCAI_2018') : #文件夹不存在时,再进行创建
os.mkdir('IJCAI_2018')
os.chdir(os.path.join(os.getcwd(), 'IJCAI_2018'))#os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略,os.getcwd()获取当前工作目录,即当前python脚本工作的目录路径,os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd num = len(titles)
print('论文总数:', num) for i in range(num):
detail = details[i] fname = detail.contents[1].get('href')#论文下载名
deatil_url = url + fname#论文下载地址 print(deatil_url)
r = requests.get(deatil_url) with open(fname, 'wb') as f:
f.write(r.content) print('已下载:', titles[i].string)
f.close() if __name__ == '__main__':
download_paper()

4、运行结果

2018年总共870篇结果如下:

Python3爬虫--两种方法(requests(urllib)和BeautifulSoup)爬取网站pdf的更多相关文章

  1. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. Python3求笛卡尔积的两种方法

    [本文出自天外归云的博客园] 电影异次元杀阵三部曲中密室线索反复出现笛卡尔积的运用.百度百科: 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为 ...

  3. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

  4. 在CentOS上安装Python3的三种方法

    Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装. 注:本文示例安装版本为Python3.5, 一.Python源代码编译安装 安 ...

  5. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  6. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  7. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  8. php如何防止图片盗用/盗链的两种方法(转)

    图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...

  9. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

随机推荐

  1. Md2All版本更新记录

    Md2All版本更新记录 版本号:V2.8.2更新日期:2018-06-281:结合云图床,解决了Latex公式复制到公众号时有可能报“图片粘贴失败的问题”;2:结合云图床,解决了Latex公式复制到 ...

  2. 【原创】python中文编码问题深入分析(三):python2.7文件读写中文编码问题

    上一篇文章介绍和分析了python2.7中使用print遇到的中文编码问题的原因和解决方案,本篇主要介绍一下python2.7中执行文件读写可能遇到的编码问题. 1.文件读取 假如我们读取一个文件,文 ...

  3. 三维重建面试4:Jacobian矩阵和Hessian矩阵

    在使用BA平差之前,对每一个观测方程,得到一个代价函数.对多个路标,会产生一个多个代价函数的和的形式,对这个和进行最小二乘法进行求解,使用优化方法.相当于同时对相机位姿和路标进行调整,这就是所谓的BA ...

  4. OpenCV:Adaboost训练时数据扩增

    更准确的模型需要更多的数据,对于传统非神经网络机器学习方法,不同的特征需要有各自相符合的数据扩增方法. 1.   在使用opencv_traincascade.exe 过程中,图像读取在 classi ...

  5. 关于OpenCV的Mat画图问题

    由于OpenCV的java版本画图有太多错误,只能自己编写画图的代码,在一个函数中,编写出画圆和深度距离的代码, 代码如下: public int CircleMyMat(Mat Show, Poin ...

  6. MFC 添加文件路径 遍历文件

    .添加MFC选择文件路径,使用MessageBox显示信息. void CMyCalLawsDlg::OnBnClickedAddfolder() { wchar_t* p; wchar_t szPa ...

  7. 通过Static 字段来维护状态是不是一个好主意

    static是申明静态字段.静态方法或者静态类的修饰符.使用static申明的字段属于类型本身而不属于任何字段,声明的类也具有一些特别特性,比如不能实例化,不能继承等.用通俗化的语言来说,static ...

  8. 08--MOOC--C/C++ 根据年月日计算星期几

    计算任何一天是星期几的几种算法 一:常用公式 W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D Y是年份数,D是这一天在这一年中的累积天数,也 ...

  9. Arduino 红外接收

    一.实物图 二.例子代码 注:git clone https://github.com/z3t0/Arduino-IRremote.git 放到Arduino 的libraries目录下面  从遥控器 ...

  10. python-selenium,关于页面滑动

    第一种: #滑到底部 js="var q=document.documentElement.scrollTop=100000" driver.execut_script(js) 目 ...