专栏首页DeveWork初学Python 之抓取当当网图书页面目录并保存到txt文件

初学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 查看

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WordPress 注册页面显示自定义提示信息

    如果你的WordPress 网站是多用户网站,那么在提供给用户注册的时候,可以自定义一些提示信息,比如说网站协议、版权声明之类的。把下面的代码放到主题的func...

    Jeff
  • WordPress免插件仅代码实现“返回顶部、返回底部、评论”效果(样式二)

    之前发表过一种样式的“返回顶部、返回底部、评论”效果,今天在这里分享Devework.com目前使用的效果:一个博客侧边滑动,返回顶部,查看评论的小工具,作为W...

    Jeff
  • 【译】WordPress 中的50个过滤器(5):第31-40个过滤器

    本文为系列第三篇,原文:50 Filters of WordPress: Filters 31-40 原文地址 在过去的两篇文章中,我们总共介绍了30个Word...

    Jeff
  • Python实现系统桌面时钟

    用Python + PyQT写的一个系统桌面时钟,刚学习Python,写的比较简陋,但是基本的功能还可以。

    py3study
  • pyqt4制作透明无边框窗体

    http://blog.chinaunix.net/uid-25979788-id-3081886.html

    bear_fish
  • pygame-KidsCanCode系列jumpy-part3-重力及碰撞检测

    这个游戏叫jumpy,大致玩法就是模拟超级玛丽一样,可以不停在各个档板上跳动,同时受到重力的作用,会向下掉,如果落下时,没有站在档板上,就挂了。

    菩提树下的杨过
  • Python 还能实现哪些 AI 游戏?附上代码一起来一把!

    人工智能作为当前热门在我们生活中得到了广泛应用,尤其是在智能游戏方面,有的已经达到了可以和职业选手匹敌的效果。而DQN算法作为智能游戏的经典选择算法,其主要是通...

    AI科技大本营
  • pygame-KidsCanCode系列jumpy-part4-弹跳

    终于要到弹跳环节了,向上弹跳其实很简单,按下空格触发时,只要把y轴速度给一个向上的速度即可。

    菩提树下的杨过
  • pygame-KidsCanCode系列jumpy-part2-加速度与摩擦力

    上一节,我们整理了一个游戏开发的新框架(即:Game类),本节将运用这个框架,实现基本的加速度及摩托力效果。

    菩提树下的杨过
  • pygame-KidsCanCode系列jumpy-part15-PowerUp加速器

    这一节我们给游戏增加点额外的奖励,大多数游戏中都会有金币、装备啥的来激励玩家,在jumpy这个游戏中,我们也可以增加类似的道具:加速器。效果图如下:

    菩提树下的杨过

扫码关注云+社区

领取腾讯云代金券