新手学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小爬虫-自动下载三亿文库文档的更多相关文章

  1. 【微信小程序】下载并预览文档——pdf、word、excel等多种类型

    .wxml文件 <view data-url="https://XXX/upload/zang." data-type="excel" catchtap= ...

  2. 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  3. js仿百度文库文档上传页面的分类选择器_第二版

    仿百度文库文档上传页面的多级联动分类选择器第二版,支持在一个页面同一时候使用多个分类选择器. 此版本号把HTML,CSS,以及图片都封装到"category.js"中.解决因文件路 ...

  4. 基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版)

    TableGo v5.8.8版震撼发布,此次版本更新如下:          1.新增两个扩展字段,用于生成自定义模板时使用.          2.自定义模板新增模板目录,可以选择不同分类目录下的模 ...

  5. 自动生成并导出word文档

    今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...

  6. IIS下不能下载文件的docx文档,XLSX文档的设置方法(转)

    IIS下不能下载文件的docx文档,XLSX文档的设置方法 Office 2007的的界面风格默认格式中都是.DOCX,XLSX,PPTX等等后缀,连结中包含此类文件时,界面风格默认什么打不开的其实只 ...

  7. 【三】MongoDB文档的CURD操作

    一.插入文档 使用insert方法插入文档到一个集合中,如果集合不存在创建集合,有以下几种方法: db.collection.insertOne({}):(v3.2 new)  #插入一个文档到集合中 ...

  8. XHTML 1.0 的三种 XML 文档类型 DOCTYPE

    XHTML 1.0 的三种 XML 文档类型 XHTML 1.0 规定了三种 XML 文档类型 XHTML 1.0 Strict <!DOCTYPE html PUBLIC "-//W ...

  9. 【现学现卖】python小爬虫

    1.给小表弟汇总一个院校列表,想来想去可以写一个小爬虫爬下来方便些,所以就看了看怎么用python写,到了基本能用的程度,没有什么特别的技巧,大多都是百度搜的,遇事不决问百度啦 2.基本流程就是: 用 ...

随机推荐

  1. Mongodb Management Studio

    1.服务器管理功能添加服务器,删除服务器 2.服务器,数据库,表,列,索引,树形显示和状态信息查看 3.查询分析器功能.支持select,insert,Delete,update支持自定义分页函数 $ ...

  2. 完美实现自己的GetProcAddress函数(转载)

    我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress ...

  3. 踏着前人的脚印学Hadoop——序列化,Writerable

    package org.apache.hadoop.io; import java.io.DataOutput;import java.io.DataInput;import java.io.IOEx ...

  4. 交互式报表和工作报表控件Stimulsoft Reports.Fx for Java

    Stimulsoft Reports.Fx for Java是一款Java平台下的报表工具控件,可以为您的应用程序添加交互式报表和工作报表.Java技术可以用于不同的平台.不同的操作系统和不同的硬件, ...

  5. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  6. Windows下LDAP服务器配置

    LDAP即轻量级目录访问协议(Lightweight Directory Access Protocol),基础知识不再赘述,本文主要记录我的配置与安装过程. LDAP for windows下载 o ...

  7. Tab的键的妙用

    vs2013输入“(”的时候自动加入了“)”,开始的时候感觉相当不方便,要按“End”才能继续输入“:”,后来发现按“Tab"也会自动跳出括号,于是满心喜欢.

  8. angularjs 选项卡 --- 自定义属性

    <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...

  9. Javascript 的类型转换之减号

    专职写JS已经有一个月了(对,没错就是一个月),从2014年11月24实习开始到今的2月份,我做的工作一直都是切图,另外跟着老板学产品,现在我一听到切图两字,我就想吐...所以我找了一份专职写JS的工 ...

  10. iOS9的适配

    1.大部分社交平台接口不支持https协议. 问题描述:在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据.对ShareSDK来说,具体表现可能是,无法授权.分享 ...