• 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. 修改Switch 的颜色

    1:效果图 2:布局 <Switch android:id="@+id/switch_bg" style="@style/switchStyle" and ...

  2. 【PostgreSQL-9.6.3】修改监听的IP和端口

    在数据目录下编辑postgresql.conf文件,我的数据目录是/usr/local/pgsql/data vi postgresql.conf 找到如下内容: ... #listen_addres ...

  3. 4星|《OKR实践指南》:老司机经验谈

    OKR 实践指南:知乎任向晖.雷明灿作品 (知乎「一小时」系列) 作者所在的公司已经实施了OKR十个季度了.算是目前少有的OKR老司机.书中介绍的是作者的实践经验,在目前的OKR中文书中这本算是比较少 ...

  4. IT狂人职场路:揭秘华为百度高管如何炼成?

    原文链接:http://www.hdeso.com/waibao/detail.asp?id=45660 原文链接:http://tech.hexun.com/2014-02-18/162264716 ...

  5. 【技术累积】【点】【java】【20】static关键字

    基础概念 是个修饰符: 修饰变量.常量.方法.代码块: 被修饰的为静态: 方便在没有创建对象的情况下来进行调用(方法/变量): static修饰的成员被所有的对象所共享: static优先于对象存在, ...

  6. spring实现helloWord

    第一步:添加架包 第二步:写一个简单的实列 package com.java.test; /** * @author nidegui * @create 2019-06-22 10:58 */ pub ...

  7. 【转载】java的常见类型转换

    //Int型数字转换成String int num1=123456; //方法1 String str1=num1+""; System.out.println(str1); // ...

  8. PAT_A1145#Hashing - Average Search Time

    Source: PAT A1145 Hashing - Average Search Time (25 分) Description: The task of this problem is simp ...

  9. HDU 4405 Aeroplane chess(概率dp,数学期望)

    题目 http://kicd.blog.163.com/blog/static/126961911200910168335852/ 根据里面的例子,就可以很简单的写出来了,虽然我现在还是不是很理解为什 ...

  10. 1、springboot+mybatis+zookeeper+dubbox+maven+pagehelper

    一.创建普通的maven的web项目 2.配置KD42WF_Part1下的pom.xml <?xml version="1.0" encoding="UTF-8&q ...