这学期新开了门“高大上”的课《机器学习》,也开始入门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):#遇到
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):#遇到
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~')