丝绸之路:一部全新的世界史(两千年来始终主宰人类文明的世界十字路口)
/ 2016-08-17
/ 浙江大学出版社
◆全景展现丝绸之路这一两千年来始终主宰人类文明的世界十字路口! ◆轰动世界的现象级畅销书! ◆席卷英国、美国、德国、意大利、荷兰、西班牙、波兰、土耳其、印度、韩国等20多个国家! ◆牛津大学*历史学家以全新视角,重新解读世界史! ◆顺便了解“一带一路”的前世今生! ◆英国亚马逊世界历史类No.1!美国亚马逊历史地理类No.1!印度非虚构榜No.1! ◆《纽约时报》畅销书,《泰晤士报》《卫报》《每日邮报》《观察者》《彭博商业》《历史今日》2015年度图书、彭博社2015年度历史图书! ◆葛剑雄、荣新江、徐文堪、邹怡、陈功、鲍达民、阿曼达·福尔曼等国内外政商学文界巨擘联袂推荐! ◆《人民日报》《光明日报》《参考消息》《环球时报》等知名媒体争相报道!
当当自营
¥87.70定价:¥128.00(6.86折)
轰动世界的现象级畅销书,横扫英国、美国、德国、意大利、土耳其、印度等20多个国家。牛津大学知名历史学家全景展现两千年来始终主宰人类文明的世界十字路口,顺便了解 “一带一路”的前世今生!读客出品
台湾的台(400年纯台湾本土事件,讲述“兄弟”自己的家常事:小事,大事,好事,坏事……)
/ 2012-08-01
/ 中国友谊出版公司
400年纯台湾本土事件,讲述“兄弟”自己的家常事。 以“编日体”形式,精选365条,图文结合讲述台湾人民记忆中的历史。 **次以平民化和家常的观点回忆历史,了解历史,了解台湾社会变迁,台湾百态。
当当自营
¥6.40定价:¥32.00(2折)
雪域长歌:西藏1949-1960(修订版)——2014年中国好书榜获奖图书
/ 2015-04-01
/ 四川人民出版社
★2014年度中国好书 ★2014年度大众喜爱的50种图书 ★中央国家机关“强素质作表率”读书活动2015年上半年推荐图书 ★四川省第十三届精神文明建设“五个一”工程奖优秀图书 ★2015年首季“优秀川版图书” ★谨以此书,献给为解放西藏和建设西藏而献出青春和生命的英雄们! ★这是一部波澜壮阔的纪实作品。 ★这是一段饱含深情的集体回忆。 ★这是一面高扬理想的信仰之旗。 ★这是一首回荡雪域的生命长歌。
当当自营
¥40.20定价:¥58.00(6.94折)
¥1.40
电子书一段不能忘记的历史,一种长存天地的精神。
爬取策略:先抓大再抓小
分析网页的xml代码就可以发现,类似的数据具有相同的结构,比如当当网的书籍信息都嵌套在相同的结构里(如下),为了防止“不具有专业精神”的正则表达式在根据字符串规则提取的过程中把网页里可能具有相同格式,但并不是我们需要的内容也提取出来,我们需要缩小作战半径,再精确打击,即首先提取每本书籍具有相同结构的”块“(下面的这些代码),然后逐个提取我们需要的内容。
<li class="linexx" id="xxxxxx">
......
步骤:
Step 1:根据初始URL生成需要爬取的URL库;
Step 2:遍历URL库中的每一个URL(即每一个网页),爬取每个网页的源码;
Step 3:遍历每个网页的源码,用正则表达式提取每本书相同的”块“;
Step 4:分析每个”块“的结构,提取所需内容;
Step 5:存储数据。
代码如下:
# -*- coding: utf-8 -*-
import requests
import re
import csv
import sys
reload(sys)
#sys.setdefaultencoding("utf-8")
class spider(object):
def __init__(self):
print 'start...'
#获取网页源码
def getSource(self, url):
html = requests.get(url)
return html.text
#获取URL库
def changePage(self, url, totalPage): #start url ='http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html'
page_group=[]
for i in range(totalPage):
newPage = re.sub(r'/pg(.*?)-cp', '/pg'+'%s'%(i+1)+'-cp', url, re.S)
page_group.append(newPage)
return page_group
#获取每本书的“块”
def getEveryBook(self, source):
everyOne = re.findall('(class="inner".*?)', source, re.S)[1:] #网页的开始部分也有匹配这个模式的内容,所以从第2个开始才是我们感兴趣的,用正则表达式需谨慎
return everyOne
#分析每本书的“块”,提取感兴趣的信息
def getInfo(self, eachBook):
info={}
# include title, author, public, price, discount
info['title']=re.search('''', eachBook, re.S)
if info['author'] == None: #调试过程中发现有一本书的结构不一样
info['author']=re.search('span>(.*?)''', eachBook, re.S).group(1)
info['price']=re.search('''yen;(.*?)<''', eachBook, re.S).group(1)
info['discount']=re.search('''price_s">(.*?)<''', eachBook, re.S).group(1)
return info
#用csv文件存储数据(有点小问题,待改)
def saveInfo(self, bookInfo):
with open('infoBook.csv', 'wb') as csvfile:
f=csv.writer(csvfile, delimiter=' ')
f.writerow(['title', 'author', 'public', 'price', 'discount'])
for each in bookInfo:
f.writerow([(each['title'], each['author'], each['public'], each['price'], each['discount'])])
if __name__ == '__main__':
bookInfo=[]
url = 'http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html'
dangdangSpider=spider()
allLinks = dangdangSpider.changePage(url, 5)
for link in allLinks:
print u'processing...' + link
html = dangdangSpider.getSource(link)
everyBook = dangdangSpider.getEveryBook(html)
for each in everyBook:
info = dangdangSpider.getInfo(each)
bookInfo.append(info)
print bookInfo
dangdangSpider.saveInfo(bookInfo)
运行的结果编码方式有问题,输出unicode格式的字符串,但是在windows的cmd中却能正确输出中文,这说明结果没问题,待以后仔细研究一下编码的问题,再来改善,也欢迎大家指点一二,感恩!