|本文为博主原创,转载请说明出处

任务需求:要求通过Google针对任意关键字爬取大量PDF文档,如K-means,KNN,SVM等。

环境:Anaconda3——Windows7-64位——Python3.6——lantern——迅雷极速版——360浏览器

解决思路:现在有一个需要下载大量特定主题的PDF文档以为特定工作提供数据支撑的任务,初步是想利用Google强大的搜索功能进行特定主题的搜索,指定文件类型filetype:pdf,如果你要指定site的话,如.edu、.org等,可以在特定的机构或学校的网站上搜索文档。比如我要下载大量svm的pdf文档,我在Google搜索栏中输入svm filetype:pdf之后分析每一页的地址,发现地址之间存在类似之处,这就为写代码批量下载PDF文档提供了便利。这是一个很通用的通过Google下载大量特定主题特定文档的爬虫,有很多用途,读者可以自己去挖掘噢!比如博主就用这个简单的爬虫正在完成导师交代的任务,当然这只是其中很小一步,但是总得一步一步往前走嘛!

先贴代码,下面再对特定行进行解释

 # -*- coding: utf-8 -*-
import urllib.request
import re#导入正则表达式包
import time #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
url_part_1="https://www.google.co.jp/search?q=svm+filetype:pdf&lr=&hl=zh-CN&as_qdr=all&ei=VIdnWZ3SGIS18QXW3aAg&start="
url_part_2="&sa=N&biw=1745&bih=810"
Page_number=28 #每一个特定主题搜索结果的页数,这个针对不同的主题结果会不一样
#这几行代码针对不同的主题要进行相应的修改,稍后再解释url_part_1和url_part_2的意思
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ timeout=20 #设置网站的访问超时时间为20秒
sleep_download_time=5 #爬一个网页休息5秒钟,不能访问的太频繁
url_list_total=[]#将所有pdf文档的链接地址放在这个列表当中
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'
#这个是我的360浏览器的user_agent,按F12可查 for i in range(0,Page_number):
url_page=url_part_1+str(i*10)+url_part_2#拼接成每个Google搜索结果的页面地址,每个页面包含10个链接,故乘以10
headers = { 'User-Agent' : user_agent,'Referer':url_page}
request= urllib.request.Request(url_page,headers=headers)
try:#可能会出现异常[WinError 10054]
page = urllib.request.urlopen(request,timeout=timeout)
except urllib.error.URLError as e:
print(e.reason) html= page.read().decode('utf-8')#必须要有.decode('utf-8')以用来转码,从byte转为utf-8
pattern = re.compile('<h3 class="r".*?<a href="(.*?)" onmousedown')#通过compile方法编译生成一个匹配模式pattern对象,然后利用这个对象来进行进一步的匹配。
url_list=re.findall(pattern,html)#搜索html,以列表形式返回全部能匹配的子串这个表达式主要是为了获取本页面的PDF链接地址 for line in url_list[:]:
url_list_total.append(line)
url_list=[]
print(page.getcode())
print(i)
page.close()
html=[]
time.sleep(sleep_download_time)#隔几秒再运行 f=open('url_list_total.txt','w')
for url in url_list_total:
f.write(url)
f.write('\n')
f.close()

注释:

7-8行:通过Google搜索的结果地址是有规律的,如通过关键字svm filetype:pdf返回的结果的第一页地址如下

https://www.google.co.jp/search?q=svm+filetype:pdf&lr=&hl=zh-CN&as_qdr=all&ei=VIdnWZ3SGIS18QXW3aAg&start=10&sa=N&biw=1745&bih=810

做如下拆分

"https://www.google.co.jp/search?q=svm+filetype:pdf&lr=&hl=zh-CN&as_qdr=all&ei=VIdnWZ3SGIS18QXW3aAg&start="     +    10     +       "&sa=N&biw=1745&bih=810"

分成三部分,方便后面进行迭代。

21行:用来包装头部的数据:

——User-Agent:头部可以携带浏览器名和版本号、操作系统名和版本号、默认语言信息;

——Referer:用来防止盗链

——Connection:表示连接状态,记录Session状态

##以上就完成了所有pdf链接的下载

------------------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------------------------------

下面就进行pdf的主动下载,代码如下:

 def getFile(url):
file_name = url.split('/')[-1]
u = urllib.request.urlopen(url)
f = open(file_name, 'wb')
block_sz = 8192
while True:
buffer = u.read(block_sz)
if not buffer:
break
f.write(buffer)
f.close()
print("Sucessful to svm" + " " + file_name) os.mkdir('svm')
os.chdir(os.path.join(os.getcwd(), 'svm'))
for url in url_list_total[:]:
getFile(url)

我在下载的时候并没有用以上的代码,而是直接通过迅雷极速版下载的,应该会快一些,当然了,用代码下载能省一些事儿!

欢迎批评指正!

网络爬虫——针对任意主题批量爬取PDF的更多相关文章

  1. python网络爬虫之使用scrapy自动爬取多个网页

    前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面 ...

  2. 爬虫(二)Python网络爬虫相关基础概念、爬取get请求的页面数据

    什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫    1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆 ...

  3. Python网络爬虫第三弹《爬取get请求的页面数据》

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  4. 【Python网络爬虫四】通过关键字爬取多张百度图片的图片

    最近看了女神的新剧<逃避虽然可耻但有用>,同样男主也是一名程序员,所以很有共鸣 被大只萝莉萌的一脸一脸的,我们来爬一爬女神的皂片. 百度搜索结果:新恒结衣 本文主要分为4个部分: 1.下载 ...

  5. python3编写网络爬虫14-动态渲染页面爬取

    一.动态渲染页面爬取 上节课我们了解了Ajax分析和抓取方式,这其实也是JavaScript动态渲染页面的一种情形,通过直接分析Ajax,借助requests和urllib实现数据爬取 但是javaS ...

  6. python网络爬虫之scrapy 调试以及爬取网页

    Shell调试: 进入项目所在目录,scrapy shell “网址” 如下例中的: scrapy shell http://www.w3school.com.cn/xml/xml_syntax.as ...

  7. Python网络爬虫案例(二)——爬取招聘信息网站

    利用Python,爬取 51job 上面有关于 IT行业 的招聘信息 版权声明:未经博主授权,内容严禁分享转载 案例代码: # __author : "J" # date : 20 ...

  8. 网络爬虫2:使用crawler4j爬取网络内容

    https://github.com/yasserg/crawler4j 需要两个包: crawler4j-4.1-jar-with-dependencies.jar slf4j-simple-1.7 ...

  9. [Python3网络爬虫开发实战] 6-Ajax数据爬取

    有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到的结果并没有.这是因为requests获取的都是 ...

随机推荐

  1. 建造者模式—设计角度重温DNF中的角色

    应用场景 假设现在我们要设计DNF中的人物角色(鬼剑士.神枪手.魔法师.圣骑士.格斗家).然而,利用面对对象的思想,必须先从实体入手,每一个角色都包含各种装备.武器.配饰,这些就当做要建造的零件,然后 ...

  2. ES6解构赋值详解

    文章转载自:http://www.zhufengpeixun.cn/article/167 解构赋值(destructuring assignment)语法是一个 Javascript 表达式,这种语 ...

  3. npm 一条命令更换淘宝源

    一条命令更换淘宝源 npm config set registry https://registry.npm.taobao.org

  4. hdu4417

    hdu4417 题意 给定一个数列,每次查询一个区间,和一个值h,问区间内有多少个数小于等于h. 分析 二分数的个数,划分树求解判断是否满足条件,划分树求解的是第k小的数,那么前面k个数肯定不大于这个 ...

  5. ReactJS入门基础

    渲染这俩字可能在很多地方都见过.但可能不太理解是啥意思. 那么首先我们来理解一下渲染. 渲染 我觉得这样理解比较通俗. 我们做一个汽车,开始是没有喷漆的(没有css) 只是些框框架架(HTML标签). ...

  6. integer与int区别以及integer.values()方法详解

    声明:本文为博主转载文章,原文地址见文末. 知识点1:integer和int的区别 /* * int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为 ...

  7. Eclipse汉化后如何还原为EN英文(实用技巧) --转

    自从那天脑袋短路后,下了个汉化包将Eclipse给汉化了,用的我真TMD的不习惯,一直想还原为EN文,试了好多办法,删文件,汉化包,改eclipse.ini文件中的"-nl zh" ...

  8. python爬虫之re正则表达式库

    python爬虫之re正则表达式库 正则表达式是用来简洁表达一组字符串的表达式. 编译:将符合正则表达式语法的字符串转换成正则表达式特征 操作符 说明 实例 . 表示任何单个字符 [ ] 字符集,对单 ...

  9. 使用DBeaver连接hive

    介绍 在hive命令行beeline中写一些很长的查询语句不是很方便,查询结果也不是很友好,于是找了一个hive的客户端界面工具DBeaver,它也支持很多符合JDBC连接的数据库,例如MySQL.O ...

  10. python爬虫 模拟登陆校园网-初级

    最近跟同学学习爬虫的时候看到网上有个帖子,好像是山大校园网不稳定,用py做了个模拟登陆很有趣,于是我走上了一条不归路..... 先上一张校园网截图 首先弄清一下模拟登陆的原理: 1:服务器判定浏览器登 ...