网络爬虫——针对任意主题批量爬取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获取的都是 ...
随机推荐
- nginx源码分析——线程池
源码: nginx 1.13.0-release 一.前言 nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影 ...
- dns劫持分析
最近在做dns解析,关注的重点在查询域名ns记录上,异常日志中捕获到一个域名,dig查询: 查询请求类型为ns,dig结果确只有一条A记录.处于好奇,查询类型改为a类型: 这个域名dig 查询A记录, ...
- SignalR来做实时Web聊天
本章和大家分享的内容是使用Signal R框架创建个简易的群聊功能,主要讲解如何在.Net的MVC中使用这个框架,由于这个项目有官方文档(当然全英文),后面也不打算写分享篇了,主要目的是让朋友们在需要 ...
- [OpenGL]配置GLFW
注:本文可转载,转载请著名出处:http://www.cnblogs.com/collectionne/p/6937644.html.本文还会修改,如果不在博客园(cnblogs)发现本文,建议访问上 ...
- mybatis中$和#java代码演示
MyBatis mapper文件中的变量引用方式#{}与${}的差别 内容来源:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下 ...
- sublime text 快捷收集
1. 文件快速导航: 这是sublime上面很好用的功能之一,ctrl+p可以调出窗口,菜单上的解释是gotoanythings ,确实如其所言,调出窗口后,直接输入关键字,可以在已打开的项目文件夹中 ...
- PHP·笔记(函数总结)
PHP 指 PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名) PHP 是一种服务器端的脚本语言,类似 ASP PHP 脚本在服务器上执行 PHP 支持 ...
- APUE-文件和目录(六)函数ftw和nftw
名字 ftw,nftw - 文件树遍历 概要 #include <ftw.h> int nftw(const char *dirpath, int (*fn) (const char *f ...
- (转) Unicode(UTF-8, UTF-16)令人混淆的概念
原文地址:http://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html 为啥需要Unicode 我们知道计算机其实挺笨的,它只认识010 ...
- 从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)
从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray) deque deque双端队列,分段连续空间数据结构,由中控的map(与其说map,不如说是数 ...