网络爬虫——针对任意主题批量爬取PDF
|本文为博主原创,转载请说明出处
任务需求:要求通过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的更多相关文章
- python网络爬虫之使用scrapy自动爬取多个网页
前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面 ...
- 爬虫(二)Python网络爬虫相关基础概念、爬取get请求的页面数据
什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫 1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆 ...
- Python网络爬虫第三弹《爬取get请求的页面数据》
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- 【Python网络爬虫四】通过关键字爬取多张百度图片的图片
最近看了女神的新剧<逃避虽然可耻但有用>,同样男主也是一名程序员,所以很有共鸣 被大只萝莉萌的一脸一脸的,我们来爬一爬女神的皂片. 百度搜索结果:新恒结衣 本文主要分为4个部分: 1.下载 ...
- python3编写网络爬虫14-动态渲染页面爬取
一.动态渲染页面爬取 上节课我们了解了Ajax分析和抓取方式,这其实也是JavaScript动态渲染页面的一种情形,通过直接分析Ajax,借助requests和urllib实现数据爬取 但是javaS ...
- python网络爬虫之scrapy 调试以及爬取网页
Shell调试: 进入项目所在目录,scrapy shell “网址” 如下例中的: scrapy shell http://www.w3school.com.cn/xml/xml_syntax.as ...
- Python网络爬虫案例(二)——爬取招聘信息网站
利用Python,爬取 51job 上面有关于 IT行业 的招聘信息 版权声明:未经博主授权,内容严禁分享转载 案例代码: # __author : "J" # date : 20 ...
- 网络爬虫2:使用crawler4j爬取网络内容
https://github.com/yasserg/crawler4j 需要两个包: crawler4j-4.1-jar-with-dependencies.jar slf4j-simple-1.7 ...
- [Python3网络爬虫开发实战] 6-Ajax数据爬取
有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到的结果并没有.这是因为requests获取的都是 ...
随机推荐
- (转+原创)java的枚举类型Enum解释
原文:http://www.cnblogs.com/mxmbk/articles/5091999.html 下文中还添加了个人的一些补充和理解. 在Java SE5之前,我们要使用枚举类型时,通常会使 ...
- 线程(java课堂笔记)
1.两种方式的差异 2.线程的生命周期 3.线程控制(线程的方法) 4.线程同步 5.线程同步锁 一. 两种方式的差异 A extends Thread :简单 不能再继承其他类了(Java单继承)同 ...
- js编写简单的贪吃蛇游戏
css代码 *{ margin:; padding:; } td{ width: 4px; height: 4px; background: #ccc; border: 2px solid #ccc; ...
- Windows系统前端常用PS快捷键:
1.设置滚轮放大缩小: 编辑--首选项--常规--用滚轮缩放 2.V 移动 ctrl+v 自动选中(图层), 3.M 选框 Shift+M 变换形状 Alt :确定圆形/矩形中心 Shift: 圆形/ ...
- Bash中的字符串变量扩展
1.向尾部方向的最小化删除 (%) $pathname="/usr/bin/local/bin"$echo ${pathname%/bin*}/usr/bin/local 2.向尾 ...
- C# 调用cmd.exe的方法
网上有很多用C#调用cmd的方法,大致如下: [c-sharp] view plaincopy private void ExecuteCmd(string command) { Proces ...
- Windows定时关机
用shutdown命令.开始菜单>运行,输入shutdown -s -t 7200 (两个小时之后关机)at 12:00 shutdown -s (12:00关机) 其他设置:shutdown ...
- 获取当前 系统时间 + 获取当前URL 键值;
一://系统当前时间 function show(){ var mydate = new Date(); var str = "" + mydate.getFullYear() + ...
- A. Karen and Morning
A. Karen and Morning time limit per test 2 seconds memory limit per test 512 megabytes input standa ...
- IBM新合作伙伴计划助力企业转型升级
IBM作为老牌企业,一直在引领者技术方面的变革.当IBM再一次从自我革新开始,期望能够更快的将认知计算和云推广给自己的合作伙伴和用户们,以帮助他们在新的转型期内,能够快人一步. ...