网络爬虫——针对任意主题批量爬取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获取的都是 ...
随机推荐
- linux tcp中time_wait
http://www.cnblogs.com/my_life/articles/3460873.html http://blog.csdn.net/sunnydogzhou/article/detai ...
- Fiddler中如何抓取app中https(443端口)数据
Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获手机发出的HTTP/HTTPS请求,总结下Fiddler截获IPhone和Android发出的HTTP/HTTPS包,前提条件是:安装 ...
- ORACLE的监听日志太大,客户端无法连接
数据库sqlplus能连接,plsql连接失败,也不报错,就定位到了是不是监听出了什么问题,删除监听,重建监听,重启监听,各种尝试都没解决问题. 却是监听日志太大导致的问题,一下是处理步骤: 查看监听 ...
- window.opener的用法
window.opener 主要用来打开窗体的父窗体,可以通过这种方式设置父窗体的值或者调用js方法. 例如: 1,window.opener.test(); ---调用父窗体中的test()方法 2 ...
- php优化代码技巧
1. 如果一个方法可静态化,就对它做静态声明.速率可提升至 4 倍. 2. echo 比 print 快. 3. 使用 echo 的多重参数(译注:指用逗号而不是句点)代替字符串连接. 4. 在执行 ...
- PHP基础入门(二)---入门必备哦!
前言 在上一章中,我们初步了解了PHP的网页基础和PHP的入门基础,今天继续给大家分享更多有关PHP的知识. 理论知识看起来可能比较枯燥一些,但是我们的实践(敲代码)毕竟离不开它. 只有理论与实践相结 ...
- Java常用类之String类练习
1.编程. 已知字符串:"this is a test of java". 按要求执行以下操作: (1) 统计该字符串中字母s出现的次数 (2) 取出子字符串"test& ...
- 面向对象(java菜鸟的课堂笔记)
类:相同的东西放在一起 分为属性和动作: 把一组或多组事物相同的特性的描述==>类 属性和动作被称为成员: //声明类的属性信息 public class **{ String name: ...
- 抽象工厂(AbstractFactory)模式-创建型模式
1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...
- 【锋利的jQuery】中全局事件ajaxStart、ajaxStop不执行
最近一直都在研究[锋利的jQuery],确实是一本好书,受益匪浅.但由于技术发展及版本更新等原因,里面还是有些坑需要踩的. 比如:第六章七节中提到的全局事件ajaxStart.ajaxStop照着案例 ...