• 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. javascript基础(完整)

    一.什么是javascript? 是一种基于对象和事件驱动(以事件驱动的方式直接对客户端的输入做出响应,无需经过服务器端)并具有安全性能的解释型脚本语言,在web应用中得到非常广泛地应用.它不需要编译 ...

  2. ListView中动态显示隐藏HeaderView和FooterView

    ListView中动态显示和隐藏Header&Footer 解决思路: 直接设置HeaderView和FooterView.setVisibility(View.GONE)无效, 布局仍然存在 ...

  3. Deutsch lernen (04)

    1. streng a. 严厉的,严格的 streng gegen sich selbst und gegen andere sein streng auf Ordnung halten 2. ver ...

  4. 1、Scala安装与基础

    1.scala与java 2.安装 3.scala编译器 4.变量声明 5.数据类型 6.操作符 7.函数调用 8.apply函数 1.scala与java scala基于java虚拟机,所有scal ...

  5. dubbo之只订阅及只注册

    只订阅 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却 ...

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

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

  7. CMMI评估流程

    原文链接:http://www.cmmcn.com/new/cmmi-105.html 当前位置:首页 >> CMMI知识库 >> CMMI相关 >> CMMI评估 ...

  8. IronPython中共享的C#基类如何向下转型

    在项目中,我们使用IronPython来定义工作流脚本来以应对科研多变的需求.项目使用的主要语言仍然是C#,使用C#封装了各种基础服务与基础设施.Python脚本只使用C#提供的服务,或者说只定义了逻 ...

  9. raspberry pi树莓派设置

    买了个pi3b 安装系统 需要class10 TF卡.读卡器 下载系统并解压Raspbianhttps://www.raspberrypi.org/downloads/raspbian/访问慢的话请用 ...

  10. 关于计算文字显示占用画面大小(System.Drawing.Graphics.MeasureString)

    最近遇到了一个需要手动为显示文字换行的场合,网上转了一圈,最后形成了下面的代码: var font = new Font("微软雅黑", 9F); - DETAIL_BASE_IN ...