Python小爬虫-自动下载三亿文库文档
新手学python,写了一个抓取网页后自动下载文档的脚本,和大家分享。
首先我们打开三亿文库下载栏目的网址,比如专业资料(IT/计算机/互联网)http://3y.uu456.com/bl-197?od=1&pn=0,可以观察到,链接中pn=后面的数字就是对应的页码,所以一会我们会用iurl = 'http://3y.uu456.com/bl-197?od=1&pn=',后面加上页码来抓取网页.
一般网页会用1,2,3...不过机智的三亿文库用0,25,50...来表示,所以我们在拼接url时还得转换一下。
右键查看网页源代码,可以观察到这里每一个文档都用一个<a>标签标记,href对应文档的链接,title是文档名字,我们只需要用正则表达式将其“扣”出来就可以了.
不过你会发现我们扣出来的文档地址eg:"bp-602d123348d7c1c708a14sqb-1.html", 并不是真正的文档下载地址,进一步点击文档至下载页面,我们可以发现文档真正的下载路径是:“dlDoc-602d123348d7c1c708a14sqb-1-toword.doc”,清晰易见,我们只需提取文档序号602d123348d7c1c708a14sqb-1,再拼接起来便OK了。
<p>
<a href="bp-602d123348d7c1c708a14sqb-1.html" title="视频会议系统" target="_blank">视频会议系统</a>
</p>
<a rel="nofollow" target="_blank" href="dlDoc-602d123348d7c1c708a14sqb-1-toword.doc">视频会议系统-第1页.doc</a>
运行结果如下:
代码如下:
# -*- coding: utf-8 -*-
#-----------------------------------------------------
# 功能:将访问的页面存储为html文件,并将页面内的文档下载至本地
# 作者:chenbjin
# 日期:2014-07-10
# 语言:Python 2.7.6
# 环境:linux(ubuntu)
#----------------------------------------------------- import string
import urllib
import urllib2
import re
import os #函数功能:抓取begin-end页面,存入threeuPage文件夹中,并将其中的文档下载到threeuFile文件夹中。
def threeu_page(burl,url,begin_page,end_page) : #The directory to save web page
sPagePath = './treeuPage'
if not os.path.exists(sPagePath) :
os.mkdir(sPagePath) #The director to save downloaded file
sFilePath = './threeuFile'
if not os.path.exists(sFilePath) :
os.mkdir(sFilePath) for i in range(begin_page,end_page+1) :
pn = (i-1)*25
#自动填充成六位的文件名,eg:00001.html
sName = sPagePath + '/'+ string.zfill(i,5) + '.html'
print 'Spidering the ' + str(i) + ' page ,saved to ' + sName + '...'
f = open(sName,'w+')
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
request = urllib2.Request(url+str(pn),headers = headers) try:
con = urllib2.urlopen(request, timeout=10).read()
#正则匹配出文档的地址
myItems = re.findall('<a href="bp-(.*?).html" title="(.*?)" target="_blank">(.*?)</a>',con,re.S)
#print "Total : ",len(myItems)
for item in myItems :
print 'Dowloading the ' +item[0] + " "+ item[1].decode('gbk') + '...'
#下载文档
durl = burl+item[0]+'-toword.doc'
urllib.urlretrieve(durl,sFilePath+'/'+item[1].decode('gbk')+'.doc')
except urllib2.URLError,e :
print e
else:
f.write(con)
f.close() #这是三亿文库中“专业资料 > IT/计算机 > 互联网”的地址
burl = 'http://3y.uu456.com/dlDoc-'
iurl = 'http://3y.uu456.com/bl-197?od=1&pn='
ibegin = 1
iend = 1
threeu_page(burl,iurl,ibegin,iend)
#end
参考资料:
1.Python爬虫入门教程:http://blog.csdn.net/column/details/why-bug.html
Python小爬虫-自动下载三亿文库文档的更多相关文章
- 【微信小程序】下载并预览文档——pdf、word、excel等多种类型
.wxml文件 <view data-url="https://XXX/upload/zang." data-type="excel" catchtap= ...
- 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档
对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...
- js仿百度文库文档上传页面的分类选择器_第二版
仿百度文库文档上传页面的多级联动分类选择器第二版,支持在一个页面同一时候使用多个分类选择器. 此版本号把HTML,CSS,以及图片都封装到"category.js"中.解决因文件路 ...
- 基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版)
TableGo v5.8.8版震撼发布,此次版本更新如下: 1.新增两个扩展字段,用于生成自定义模板时使用. 2.自定义模板新增模板目录,可以选择不同分类目录下的模 ...
- 自动生成并导出word文档
今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...
- IIS下不能下载文件的docx文档,XLSX文档的设置方法(转)
IIS下不能下载文件的docx文档,XLSX文档的设置方法 Office 2007的的界面风格默认格式中都是.DOCX,XLSX,PPTX等等后缀,连结中包含此类文件时,界面风格默认什么打不开的其实只 ...
- 【三】MongoDB文档的CURD操作
一.插入文档 使用insert方法插入文档到一个集合中,如果集合不存在创建集合,有以下几种方法: db.collection.insertOne({}):(v3.2 new) #插入一个文档到集合中 ...
- XHTML 1.0 的三种 XML 文档类型 DOCTYPE
XHTML 1.0 的三种 XML 文档类型 XHTML 1.0 规定了三种 XML 文档类型 XHTML 1.0 Strict <!DOCTYPE html PUBLIC "-//W ...
- 【现学现卖】python小爬虫
1.给小表弟汇总一个院校列表,想来想去可以写一个小爬虫爬下来方便些,所以就看了看怎么用python写,到了基本能用的程度,没有什么特别的技巧,大多都是百度搜的,遇事不决问百度啦 2.基本流程就是: 用 ...
随机推荐
- HDU 1465
排列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 大家常常 ...
- C++质因式分解
分解质因数是将一个数差分成为几个质数相乘,本函数n初始取2 void prim(int m, int n) { if (m > n) { while (m%n) n++; m/=n; prim( ...
- java运算符的优先级
Java 编辑 运算符 结合性 [ ] . ( ) (方法调用) 从左向右 ! ~ ++ -- +(一元运算) -(一元运算) 从右向左 * / % 从左向右 + - 从左向右 << & ...
- JVM-class文件完全解析-类索引,父类索引和索引集合
类索引,父类索引和接口索引集合 前面介绍了class文件,从头开始的魔数,次版本号,主版本号,常量池入口,常量池,访问标志.那么再接下来的就是用来确定这个类的继承关系的类索引,父类索引和接口索引集合这 ...
- STM32串口USART1的使用方法
前言: 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的 波特率选择,支持同 ...
- matlab求曲线长度
曲线段在上的弧长为采用积分所求弧长s=∫√(1+y'²)dxmatlab求出各点的导数,然后按照上式积分 clear>> x=1:0.1:10;>> y=rand(1,leng ...
- hdu 2054
Ps:WA了无数次,,简直成了心病..今天终于AC了..先取整数部分,去零,判断位数相等否,再比较.如果相等,再取小数部分,去零,比较,输出....好烦... 代码; #include "s ...
- hdu 2071
Ps:输出n个数里最大的 #include "stdio.h" int main(){ ],max; int i,j,n,t; while(~scanf("%d" ...
- 玩转无线电 -- 温哥华天车 RFID 票务系统
0x00 前言 如今物联网 RFID系统已经完全融入了我们的生活当中. 从楼宇门禁到 Apple Pay. 可以说其身影是无处不在.很多网友也分享了自己对RFID系统的安全测试心得.不过大多还是基于门 ...
- 解决:信息中插入avi格式的视频时,提示“unsupported video format”
[测试步骤]:新建信息,添加AVI格式的视频 [测试结果]:添加时弹出提示"unsupported video format" 该问题主要提现在手机彩信视频附件不支持该AVI格式的 ...