Python3爬虫--两种方法(requests(urllib)和BeautifulSoup)爬取网站pdf
- 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的更多相关文章
- 小白学 Python 爬虫(16):urllib 实战之爬取妹子图
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- Python3求笛卡尔积的两种方法
[本文出自天外归云的博客园] 电影异次元杀阵三部曲中密室线索反复出现笛卡尔积的运用.百度百科: 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为 ...
- Python 中格式化字符串 % 和 format 两种方法之间的区别
Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...
- 在CentOS上安装Python3的三种方法
Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装. 注:本文示例安装版本为Python3.5, 一.Python源代码编译安装 安 ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- android 之 启动画面的两种方法
现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...
- [转载]C#读写txt文件的两种方法介绍
C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...
- php如何防止图片盗用/盗链的两种方法(转)
图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...
- WPF程序将DLL嵌入到EXE的两种方法
WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...
随机推荐
- javascript基础(完整)
一.什么是javascript? 是一种基于对象和事件驱动(以事件驱动的方式直接对客户端的输入做出响应,无需经过服务器端)并具有安全性能的解释型脚本语言,在web应用中得到非常广泛地应用.它不需要编译 ...
- ListView中动态显示隐藏HeaderView和FooterView
ListView中动态显示和隐藏Header&Footer 解决思路: 直接设置HeaderView和FooterView.setVisibility(View.GONE)无效, 布局仍然存在 ...
- Deutsch lernen (04)
1. streng a. 严厉的,严格的 streng gegen sich selbst und gegen andere sein streng auf Ordnung halten 2. ver ...
- 1、Scala安装与基础
1.scala与java 2.安装 3.scala编译器 4.变量声明 5.数据类型 6.操作符 7.函数调用 8.apply函数 1.scala与java scala基于java虚拟机,所有scal ...
- dubbo之只订阅及只注册
只订阅 问题 如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却 ...
- OpenCV:Adaboost训练时数据扩增
更准确的模型需要更多的数据,对于传统非神经网络机器学习方法,不同的特征需要有各自相符合的数据扩增方法. 1. 在使用opencv_traincascade.exe 过程中,图像读取在 classi ...
- CMMI评估流程
原文链接:http://www.cmmcn.com/new/cmmi-105.html 当前位置:首页 >> CMMI知识库 >> CMMI相关 >> CMMI评估 ...
- IronPython中共享的C#基类如何向下转型
在项目中,我们使用IronPython来定义工作流脚本来以应对科研多变的需求.项目使用的主要语言仍然是C#,使用C#封装了各种基础服务与基础设施.Python脚本只使用C#提供的服务,或者说只定义了逻 ...
- raspberry pi树莓派设置
买了个pi3b 安装系统 需要class10 TF卡.读卡器 下载系统并解压Raspbianhttps://www.raspberrypi.org/downloads/raspbian/访问慢的话请用 ...
- 关于计算文字显示占用画面大小(System.Drawing.Graphics.MeasureString)
最近遇到了一个需要手动为显示文字换行的场合,网上转了一圈,最后形成了下面的代码: var font = new Font("微软雅黑", 9F); - DETAIL_BASE_IN ...