初学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.00 (0%) - 0 个投票
5 条 评论
  1. 博主,本站右下角展开导航 分享 评论是怎么实现的,谢谢!

    9年前 回复
    • 请自己找,本站有文章

      9年前 回复
      • 已经翻完了没找到,是手机版的右下角展开导航 :???:

        9年前 回复
        • 直达链接:http://devework.com/wordpress-top-bottom-comment2.html

          9年前 回复
          • 谢谢博主 :!:

            9年前 回复
发表评论