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版开源了 ...
随机推荐
- 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别
1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...
- ★Java语法(二)——————————数据类型常见问题
1.用float型定义变量:float a = 3.14 :是否正确? 不正确.“=” 两边的精度类型不匹配,应为:float a =(float)3.14 或 float a =3.14F 或 ...
- weblogic详解
一.简介 WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发.集成.部署和管理大型分布式Web ...
- How to add jdk8 in Eclipse Indigo
I just read How to have Eclipse use JDK8 to compile a project? What i added jdk8 to eclipse as, Fro ...
- hadoop中的job.setOutputKeyClass与job.setMapOutputKeyClass
初学mr时,觉得没什么,但是学了一段时间,重新复习时发现程序中mr程序中一般都会有 hadoop中的job.setOutputKeyClass(theClass)与job.setOutputValue ...
- BZOJ 1179 抢掠计划atm (缩点+有向无环图DP)
手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/article/details/81061601 https:// ...
- QT中tableview不能更新数据,why?
model->select(); //model->removeColumn(0);++++++++++++++++++++ //model->setHeaderData(model ...
- java中类的路径为什么这么长
- Spring中获取Session的方法汇总
Spring: web.xml <listener> <listener-class>org.springframework.web.context.request.Reque ...
- Linux排序命令sort(转)
Linux sort命令用于将文本文件内容加以排序.sort可针对文本文件的内容,以行为单位来排序. 语法 sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符&g ...