初学Python 之抓取当当网图书页面目录并保存到txt文件
这学期新开了门“高大上”的课《机器学习》,也开始入门Python。然后跟我们一样初学Python 的老师布置了个“作业”——用Python 弄个抓取当当网图书页面目录并保存到txt文件的小程序。
然后昨天去找了篇入门教程看了下,顺便翻了翻其他人的源码将这个搞了出来。当然,还是似懂非懂的,高手就指点下哈。
说下几点:
1、之所以用当当网的作为数据来源是因为相比于亚马逊京东等其目录的那个div 的id 比较固定,为catalog,好抓。
2、但也有个坑,对于某些厚的书,其默认只输出部分目录;真正的目录其实是在某个textarea 标签下的(你可以去当当网看下源代码);所以正确思路应该是抓取解析id 为catalog 的div 下的textarea 的文本内容。
菜鸟级别的代码:
# -*- coding: utf-8 -*- #当当网图书目录抓取 #已经实现抓取目录 #实现写入到txt文件中 #新增匹配字符串 #新增书名抓取(略有bug) #自定义输入url #参考 http://blog.csdn.net/nwpulei/article/details/7272832 import urllib2 import re from sgmllib import SGMLParser class ListName(SGMLParser): def reset(self): self.item = [] self.title = [] self.flag = False self.getdata = False self.verbatim = 0 self.is_h1 = False SGMLParser.reset(self) def start_div(self, attrs): if self.flag == True: self.verbatim +=1 #进入子层div了,层数加1 return for k,v in attrs:#遍历div的所有属性以及其值 if k == 'id' and v == 'catalog': self.flag = True return def end_div(self):#遇到</div> if self.verbatim == 0: self.flag = False if self.flag == True:#退出子层div了,层数减1 self.verbatim -=1 def start_textarea(self, attrs): if self.flag == False: return self.getdata = True def end_textarea(self):#遇到</textarea> if self.getdata: self.getdata = False def start_h1(self, attrs): self.is_h1 = True def end_h1(self): self.is_h1 = False def handle_data(self, text):#处理文本 if self.getdata: self.item.append(text) if self.is_h1: self.title.append(text) def print2txt(self): print 'Reading >>'+self.title[0].decode('gbk').encode('utf8') f = open(filename[0]+'.txt','w') for i in self.item: f.write(i.decode('gbk').encode('utf8')) f.close() # url = 'http://product.dangdang.com/23422719.html' url = raw_input("请输入当当网的图书链接:") number = 'http://product.dangdang.com/(.*).html' filename = re.findall(number,url) # print filename[0] content =urllib2.urlopen(url).read() print ('正在读取'+url+'的内容...') lister = ListName() lister.feed(content) lister.print2txt() print('目录已抓取写入到'+filename[0]+'.txt中,end~') |
---|
代码排版不好看的话可以点击https://gist.github.com/Jeff2Ma/24f6c49877ebbfec9900 查看
- 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL
- 10x Python开发者必读:本月Python文章TOP 10
- Linux下更换默认yum源为网易yum源的操作记录
- yum源使用的几个报错小总结
- JQuery笔记(一)
- Haproxy和Nginx负载均衡测试效果对比记录
- JQuery笔记(三) jquery的用途
- Heartbeat使用梳理
- JQuery笔记(二) animate支持的属性
- 腾讯叮当首次系统性展示AI能力 开放日展示实战型解决方案
- Execute 方法(Find 对象)
- 在容器中部署mysql与数据持久化
- silverlight如何在运行时用代码动态控制(或创建)动画
- 小程序深夜连发4大功能!你们要的直播来了!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux查看进程的所有信息的办法示例
- PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
- Python基于traceback模块获取异常信息
- PHP实现微信商户支付企业付款到零钱功能
- PHP调用微博接口实现微博登录的办法示例
- thinkphp3.2同时连接两个数据库的简单方法
- php实现微信企业付款到个人零钱功能
- php中对象引用和复制实例分析
- php中上传文件的的解决方案
- PHP实现与java 通信的插件使用教程
- thinkPHP5框架接口写法简单示例
- php实现数组重复数字统计实例
- php提取微信账单的有效信息
- php使用pecl方式安装扩展操作示例
- RSA实现JS前端加密与PHP后端解密功能示例