当前位置:   article > 正文

利用Python的requests模块爬取当当网的书籍信息(待续)_爬取并下载当当网某一本书的网页内容,并保存为html格式

爬取并下载当当网某一本书的网页内容,并保存为html格式

        这次通过python的requests模块制作一个小爬虫,用来爬取当当网的书籍信息,初始URL为http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html,网页的部分源码如下,我们需要从中爬取书籍的名称(title)、作者(author)、出版商(publisher)、价格(price)、打折(discount)这些信息。

  1. <div class="col switch" >
  2. <a href='/cp01.36.11.00.00.00-shbig.html' class='' name='Dt'><span class='pic_btn'></span>大图</a><a href='javascript:void(0);' class='on' name='Lb'><span class='list_btn'></span>列表</a></div></div></div></div><div class="spacer"></div><div id='component_2963530'></div><div class="spacer"></div><div class="book_shoplist" dd_utopia = "on" name=Product><div id='component_2963524'></div><div class="con shoplist" > <ul class="list_aa listimg" id="component_0__0__3058">
  3. <li class="line1" id="24017630">
  4. <div class="inner">
  5. <a title=" 丝绸之路:一部全新的世界史(两千年来始终主宰人类文明的世界十字路口) " class="pic" href="http://product.dangdang.com/24017630.html#ddclick?act=click&pos=24017630_0_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" ><img src='http://img3x0.ddimg.cn/32/5/24017630-1_l_9.jpg' alt=' 丝绸之路:一部全新的世界史(两千年来始终主宰人类文明的世界十字路口) ' /></a><p class="name" ><a title=" 丝绸之路:一部全新的世界史(两千年来始终主宰人类文明的世界十字路口) " href="http://product.dangdang.com/24017630.html#ddclick?act=click&pos=24017630_0_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" > 丝绸之路:一部全新的世界史(两千年来始终主宰人类文明的世界十字路口) </a></p><p class="star" ><span class="level"><span style="width: 100%;"></span></span><a href="http://comm.dangdang.com/review/reviewlist.php?pid=24017630#ddclick?act=sort_total_review_count_desc&pos=24017630_0_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" name="P_pl">131条评论</a></p><div class="publisher_info"><p class="author"><span></span>[英]<a href='http://search.dangdang.com/?key2=彼得.弗兰科潘&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='[英]彼得.弗兰科潘 (Peter Frankopan) 著,邵旭东,孙芳 译,徐文堪 审校'>彼得.弗兰科潘</a> (<a href='http://search.dangdang.com/?key2=Peter&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='[英]彼得.弗兰科潘 (Peter Frankopan) 著,邵旭东,孙芳 译,徐文堪 审校'>Peter</a> <a href='http://search.dangdang.com/?key2=Frankopan&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='[英]彼得.弗兰科潘 (Peter Frankopan) 著,邵旭东,孙芳 译,徐文堪 审校'>Frankopan</a>) 著,<a href='http://search.dangdang.com/?key2=邵旭东&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='[英]彼得.弗兰科潘 (Peter Frankopan) 著,邵旭东,孙芳 译,徐文堪 审校'>邵旭东</a><a href='http://search.dangdang.com/?key2=孙芳&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='[英]彼得.弗兰科潘 (Peter Frankopan) 著,邵旭东,孙芳 译,徐文堪 审校'>孙芳</a> 译,<a href='http://search.dangdang.com/?key2=徐文堪&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='[英]彼得.弗兰科潘 (Peter Frankopan) 著,邵旭东,孙芳 译,徐文堪 审校'>徐文堪</a> 审校</p><p class="publishing_time"><span></span>/ 2016-08-17 </p><p class="publishing"><span></span>/ <a href='http://search.dangdang.com/?key=&key3=%D5%E3%BD%AD%B4%F3%D1%A7%B3%F6%B0%E6%C9%E7&medium=01&category_path=01.00.00.00.00.00' name='P_cbs' title='浙江大学出版社'>浙江大学出版社</a></p></div><p class="detail" > ◆全景展现丝绸之路这一两千年来始终主宰人类文明的世界十字路口!
  6. ◆轰动世界的现象级畅销书!
  7. ◆席卷英国、美国、德国、意大利、荷兰、西班牙、波兰、土耳其、印度、韩国等20多个国家!
  8. ◆牛津大学*历史学家以全新视角,重新解读世界史!
  9. ◆顺便了解“一带一路”的前世今生!
  10. ◆英国亚马逊世界历史类No.1!美国亚马逊历史地理类No.1!印度非虚构榜No.1!
  11. ◆《纽约时报》畅销书,《泰晤士报》《卫报》《每日邮报》《观察者》《彭博商业》《历史今日》2015年度图书、彭博社2015年度历史图书!
  12. ◆葛剑雄、荣新江、徐文堪、邹怡、陈功、鲍达民、阿曼达·福尔曼等国内外政商学文界巨擘联袂推荐!
  13. ◆《人民日报》《光明日报》《参考消息》《环球时报》等知名媒体争相报道!
  14. </p><p class="dang" style="display: block;">当当自营</p><p class="buy_button"><a class='listbtn_buy' name='Buy'
  15. dd_name='加入购物车' href='javascript:AddToShoppingCart(24017630)' ddclick='act=buy &pos=24017630_0_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori'></a><a class='listbtn_collect' dd_name='加入收藏' id="lcase24017630" href="javascript:showMsgBox('lcase24017630','24017630','http://wish.dangdang.com/wishlist/remote_addtofavorlist.aspx');" name="Sc" ddclick='act=favor&pos=24017630_0_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori'></a></p><p class="price" > <span class="price_n">¥87.70</span><a style="color: #878787;text-decoration:none;">定价:</a><span class="price_r">¥128.00</span>(<span class="price_s">6.86折</span>)</p><p class="subtitle" > 轰动世界的现象级畅销书,横扫英国、美国、德国、意大利、土耳其、印度等20多个国家。牛津大学知名历史学家全景展现两千年来始终主宰人类文明的世界十字路口,顺便了解 “一带一路”的前世今生!读客出品 </p><span class="tag_box"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="50" height="50"><param name="movie" value="http://img30.ddimg.cn/files/66/20/12001044.swf"/><param name="quality" value="high"/><param name="wmode" value="transparent" /><embed src="http://img30.ddimg.cn/files/66/20/12001044.swf" quality="high" wmode="transparent" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="50" height="50"></embed></object></span> </div>
  16. </li>
  17. <li class="line2" id="22863348">
  18. <div class="inner">
  19. <a title=" 台湾的台(400年纯台湾本土事件,讲述“兄弟”自己的家常事:小事,大事,好事,坏事……) " class="pic" href="http://product.dangdang.com/22863348.html#ddclick?act=click&pos=22863348_1_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" ><img src='http://img3x8.ddimg.cn/90/12/22863348-1_l_1.jpg' alt=' 台湾的台(400年纯台湾本土事件,讲述“兄弟”自己的家常事:小事,大事,好事,坏事……) ' /></a><p class="name" ><a title=" 台湾的台(400年纯台湾本土事件,讲述“兄弟”自己的家常事:小事,大事,好事,坏事……) " href="http://product.dangdang.com/22863348.html#ddclick?act=click&pos=22863348_1_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" > 台湾的台(400年纯台湾本土事件,讲述“兄弟”自己的家常事:小事,大事,好事,坏事……) </a></p><p class="star" ><span class="level"><span style="width: 100%;"></span></span><a href="http://comm.dangdang.com/review/reviewlist.php?pid=22863348#ddclick?act=sort_total_review_count_desc&pos=22863348_1_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" name="P_pl">1913条评论</a></p><div class="publisher_info"><p class="author"><span></span><a href='http://search.dangdang.com/?key2=到尾&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='到尾 著'>到尾</a></p><p class="publishing_time"><span></span>/ 2012-08-01 </p><p class="publishing"><span></span>/ <a href='http://search.dangdang.com/?key=&key3=%D6%D0%B9%FA%D3%D1%D2%EA%B3%F6%B0%E6%B9%AB%CB%BE&medium=01&category_path=01.00.00.00.00.00' name='P_cbs' title='中国友谊出版公司'>中国友谊出版公司</a></p></div><p class="detail" >   400年纯台湾本土事件,讲述“兄弟”自己的家常事。
  20.   以“编日体”形式,精选365条,图文结合讲述台湾人民记忆中的历史。
  21. **次以平民化和家常的观点回忆历史,了解历史,了解台湾社会变迁,台湾百态。
  22. </p><p class="dang" style="display: block;">当当自营</p><p class="buy_button"><a class='listbtn_buy' name='Buy'
  23. dd_name='加入购物车' href='javascript:AddToShoppingCart(22863348)' ddclick='act=buy &pos=22863348_1_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori'></a><a class='listbtn_collect' dd_name='加入收藏' id="lcase22863348" href="javascript:showMsgBox('lcase22863348','22863348','http://wish.dangdang.com/wishlist/remote_addtofavorlist.aspx');" name="Sc" ddclick='act=favor&pos=22863348_1_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori'></a></p><p class="price" > <span class="price_n">¥6.40</span><a style="color: #878787;text-decoration:none;">定价:</a><span class="price_r">¥32.00</span>(<span class="price_s">2折</span>)</p><p class="subtitle" > </p><span class="tag_box"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="50" height="50"><param name="movie" value="http://img38.ddimg.cn/files/4/32/11000983.swf"/><param name="quality" value="high"/><param name="wmode" value="transparent" /><embed src="http://img38.ddimg.cn/files/4/32/11000983.swf" quality="high" wmode="transparent" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="50" height="50"></embed></object></span> </div>
  24. </li>
  25. <li class="line3" id="23484643">
  26. <div class="inner">
  27. <a title=" 雪域长歌:西藏1949-1960(修订版)——2014年中国好书榜获奖图书 " class="pic" href="http://product.dangdang.com/23484643.html#ddclick?act=click&pos=23484643_2_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" ><img src='http://img3x3.ddimg.cn/61/3/23484643-1_l_2.jpg' alt=' 雪域长歌:西藏1949-1960(修订版)——2014年中国好书榜获奖图书 ' /></a><p class="name" ><a title=" 雪域长歌:西藏1949-1960(修订版)——2014年中国好书榜获奖图书 " href="http://product.dangdang.com/23484643.html#ddclick?act=click&pos=23484643_2_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" > 雪域长歌:西藏1949-1960(修订版)——2014年中国好书榜获奖图书 </a></p><p class="star" ><span class="level"><span style="width: 100%;"></span></span><a href="http://comm.dangdang.com/review/reviewlist.php?pid=23484643#ddclick?act=sort_total_review_count_desc&pos=23484643_2_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori" target="_blank" name="P_pl">2919条评论</a></p><div class="publisher_info"><p class="author"><span></span><a href='http://search.dangdang.com/?key2=张小康&medium=01&category_path=01.00.00.00.00.00' name='P_zz' title='张小康'>张小康</a></p><p class="publishing_time"><span></span>/ 2015-04-01 </p><p class="publishing"><span></span>/ <a href='http://search.dangdang.com/?key=&key3=%CB%C4%B4%A8%C8%CB%C3%F1%B3%F6%B0%E6%C9%E7&medium=01&category_path=01.00.00.00.00.00' name='P_cbs' title='四川人民出版社'>四川人民出版社</a></p></div><p class="detail" > ★2014年度中国好书
  28. ★2014年度大众喜爱的50种图书
  29. ★中央国家机关“强素质作表率”读书活动2015年上半年推荐图书
  30. ★四川省第十三届精神文明建设“五个一”工程奖优秀图书
  31. ★2015年首季“优秀川版图书”
  32. ★谨以此书,献给为解放西藏和建设西藏而献出青春和生命的英雄们!
  33. ★这是一部波澜壮阔的纪实作品。
  34. ★这是一段饱含深情的集体回忆。
  35. ★这是一面高扬理想的信仰之旗。
  36. ★这是一首回荡雪域的生命长歌。
  37. </p><p class="dang" style="display: block;">当当自营</p><p class="buy_button"><a class='listbtn_buy' name='Buy'
  38. dd_name='加入购物车' href='javascript:AddToShoppingCart(23484643)' ddclick='act=buy &pos=23484643_2_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori'></a><a class='listbtn_collect' dd_name='加入收藏' id="lcase23484643" href="javascript:showMsgBox('lcase23484643','23484643','http://wish.dangdang.com/wishlist/remote_addtofavorlist.aspx');" name="Sc" ddclick='act=favor&pos=23484643_2_2_p&cat=01.36.11.00.00.00&key=&qinfo=&pinfo=6681_1_60&minfo=&ninfo=&custid=&permid=20161013215306438861012252117425162&ref=&rcount=&type=&t=1477655977000&searchapi_version=test_ori'></a></p><p class="price" > <span class="price_n">¥40.20</span><a style="color: #878787;text-decoration:none;">定价:</a><span class="price_r">¥58.00</span>(<span class="price_s">6.94折</span>)</p>
  39. <div class="ebook_buy">
  40. <p class="buy_button">
  41. <a class="listbtn_buy" id="A13" dd_name="加入购物车"
  42. href="javascript:AddToShoppingCart('1900339746')"
  43. name="Buy"></a><a class="listbtn_collect" id="A14" dd_name="加入收藏" href='javascript:showMsgBox("lcase23484643","1900339746","http://wish.dangdang.com/wishlist/remote_addtofavorlist.aspx");' name=""></a>
  44. </p>
  45. <p class="price"><span class="price_n">¥1.40</span></p>
  46. <a class="ebook_link" href="http://product.dangdang.com/product.aspx?product_id=1900339746" target="_blank" title="电子书" name="Ebook">电子书</a>
  47. </div><p class="subtitle" > 一段不能忘记的历史,一种长存天地的精神。 </p><span class="tag_box"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="50" height="50"><param name="movie" value="http://img33.ddimg.cn/files/66/20/12001044.swf"/><param name="quality" value="high"/><param name="wmode" value="transparent" /><embed src="http://img33.ddimg.cn/files/66/20/12001044.swf" quality="high" wmode="transparent" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="50" height="50"></embed></object></span> </div>
  48. </li>


        这里我们采用的 正则表达式解析网页源码,有兴趣的童鞋可以使用 xpathbeautifulsoup替代,将更为方便,因为正则表达式只是将网页源码看作个比较“长”的字符串处理而已,后面两种工具则充分利用了xml语言树型结构的特点,自然更加人性化。

        爬取策略:先抓大再抓小

        分析网页的xml代码就可以发现,类似的数据具有相同的结构,比如当当网的书籍信息都嵌套在相同的结构里(如下),为了防止“不具有专业精神”的正则表达式在根据字符串规则提取的过程中把网页里可能具有相同格式,但并不是我们需要的内容也提取出来,我们需要缩小作战半径,再精确打击,即首先提取每本书籍具有相同结构的”块“(下面的这些代码),然后逐个提取我们需要的内容。

<li class="linexx" id="xxxxxx">
......
</li>
        步骤:

Step 1:根据初始URL生成需要爬取的URL库;

Step 2:遍历URL库中的每一个URL(即每一个网页),爬取每个网页的源码;

Step 3:遍历每个网页的源码,用正则表达式提取每本书相同的”块“;

Step 4:分析每个”块“的结构,提取所需内容;

Step 5:存储数据。


代码如下:

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import re
  4. import csv
  5. import sys
  6. reload(sys)
  7. #sys.setdefaultencoding("utf-8")
  8. class spider(object):
  9. def __init__(self):
  10. print 'start...'
  11. #获取网页源码
  12. def getSource(self, url):
  13. html = requests.get(url)
  14. return html.text
  15. #获取URL库
  16. def changePage(self, url, totalPage): #start url ='http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html'
  17. page_group=[]
  18. for i in range(totalPage):
  19. newPage = re.sub(r'/pg(.*?)-cp', '/pg'+'%s'%(i+1)+'-cp', url, re.S)
  20. page_group.append(newPage)
  21. return page_group
  22. #获取每本书的“块”
  23. def getEveryBook(self, source):
  24. everyOne = re.findall('(class="inner".*?</li>)', source, re.S)[1:] #网页的开始部分也有匹配这个模式的内容,所以从第2个开始才是我们感兴趣的,用正则表达式需谨慎
  25. return everyOne
  26. #分析每本书的“块”,提取感兴趣的信息
  27. def getInfo(self, eachBook):
  28. info={}
  29. # include title, author, public, price, discount
  30. info['title']=re.search('<a title="(.*?)"', eachBook, re.S).group(1)
  31. info['author']=re.search('''name='P_zz' title='(.*?)'>''', eachBook, re.S)
  32. if info['author'] == None: #调试过程中发现有一本书的结构不一样
  33. info['author']=re.search('span>(.*?)</p', eachBook, re.S).group(1)
  34. else:
  35. info['author']= info['author'].group(1)
  36. info['public']=re.search('''name='P_cbs' title='(.*?)'>''', eachBook, re.S).group(1)
  37. info['price']=re.search('''yen;(.*?)<''', eachBook, re.S).group(1)
  38. info['discount']=re.search('''price_s">(.*?)<''', eachBook, re.S).group(1)
  39. return info
  40. #用csv文件存储数据(有点小问题,待改)
  41. def saveInfo(self, bookInfo):
  42. with open('infoBook.csv', 'wb') as csvfile:
  43. f=csv.writer(csvfile, delimiter=' ')
  44. f.writerow(['title', 'author', 'public', 'price', 'discount'])
  45. for each in bookInfo:
  46. f.writerow([(each['title'], each['author'], each['public'], each['price'], each['discount'])])
  47. if __name__ == '__main__':
  48. bookInfo=[]
  49. url = 'http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html'
  50. dangdangSpider=spider()
  51. allLinks = dangdangSpider.changePage(url, 5)
  52. for link in allLinks:
  53. print u'processing...' + link
  54. html = dangdangSpider.getSource(link)
  55. everyBook = dangdangSpider.getEveryBook(html)
  56. for each in everyBook:
  57. info = dangdangSpider.getInfo(each)
  58. bookInfo.append(info)
  59. print bookInfo
  60. dangdangSpider.saveInfo(bookInfo)

        运行的结果编码方式有问题,输出unicode格式的字符串,但是在windows的cmd中却能正确输出中文,这说明结果没问题,待以后仔细研究一下编码的问题,再来改善,也欢迎大家指点一二,感恩!





本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号