当前位置:   article > 正文

Python |(爬虫 )爬取当当网书籍信息存到Excel中_csdn当当网excel数据

csdn当当网excel数据

文献检索作业,小白也很无奈。还好有学霸同学的可以借鉴。

一、任务

获取当当网上至少300本书【均为某类书,如Linux相关的书籍,或C++相关的书籍】的信息,包括书名,网址,价格,作者,并存在excel表格中。

二、分析

(一)、单页面的信息分析

源代码分析

在当当网的搜索框输入“Linux”,出现搜索后的页面,按F12查看源代码。 

  1. <li ddt-pit="1" class="line1" id="p25345462" sku="25345462">
  2. <a title=" 鸟哥的Linux私房菜 基础学习篇 第四版" ddclick="act=normalResult_picture&amp;pos=25345462_0_1_q" class="pic" name="itemlist-picture" dd_name="单品图片" href="http://product.dangdang.com/25345462.html" target="_blank">
  3. <!--a标签的title中是书名信息,href中是网址信息,且对于每本书都是这样。而只有该标签才有 dd_name="单品图片" 的属性值-->
  4. <img src="http://img3m2.ddimg.cn/76/18/25345462-1_b_11.jpg" alt=" 鸟哥的Linux私房菜 基础学习篇 第四版">
  5. </a>
  6. <p class="name" name="title">
  7. <a title=" 鸟哥的Linux私房菜 基础学习篇 第四版畅销Linux入门书升级版 鸟哥教你从入门到精通 适用Linux系统应用和开发及运维的人员 涵盖linux内核 命令行 嵌入式 Shell与Shell Scripts技巧精粹 基于CentOS 7.x" href="http://product.dangdang.com/25345462.html" ddclick="act=normalResult_title&amp;pos=25345462_0_1_q" name="itemlist-title" dd_name="单品标题" target="_blank"> 鸟哥的<font class="skcolor_ljg">Linux</font>私房菜 基础学习篇 第四版畅销Linux入门书升级版 鸟哥教你从入门到精通 适用Linux系统应用和开发及运维的人员 涵盖linux内核 命令行 嵌入式 Shell与Shell Scripts技巧精粹 基于CentOS 7.x
  8. </a>
  9. </p>
  10. <p class="detail">※ 鸟哥倾囊相授,(中简略),内容更加精彩!
  11. </p>
  12. <p class="price">
  13. <span class="search_now_price">¥113.30
  14. </span>
  15. <!--span标签的内容是价格信息,且对于每本书都是这样。而只有该标签才有 class="search_now_price" 的属性值-->
  16. <a class="search_discount" style="text-decoration:none;">定价:
  17. </a>
  18. <span class="search_pre_price">¥118.00</span><span class="search_discount">&nbsp; (9.61折)
  19. </span>
  20. </p>
  21. <div class="lable_label">
  22. <span class="new_lable" y="">
  23. <span class="new_lable1">当当自营</span>
  24. </span>
  25. </div>
  26. <p class="search_star_line">
  27. <span class="search_star_black">
  28. <span style="width: 100%;"></span>
  29. </span>
  30. <a href="http://product.dangdang.com/25345462.html?point=comment_point" target="_blank" name="itemlist-review" dd_name="单品评论" class="search_comment_num" ddclick="act=click_review_count&amp;pos=25345462_0_1_q">13条评论
  31. </a>
  32. </p>
  33. <span class="tag_box"></span>
  34. <p class="search_book_author">
  35. <span>
  36. <a href="http://search.dangdang.com/?key2=鸟哥&amp;medium=01&amp;category_path=01.00.00.00.00.00" name="itemlist-author" dd_name="单品作者" title="鸟哥">鸟哥
  37. </a>
  38. </span>
  39. <span> /2018-11-01
  40. </span>
  41. <span> /
  42. <a href="http://search.dangdang.com/?key=&amp;key3=%C8%CB%C3%F1%D3%CA%B5%E7%B3%F6%B0%E6%C9%E7&amp;medium=01&amp;category_path=01.00.00.00.00.00" name="P_cbs" dd_name="单品出版社" title="人民邮电出版社">人民邮电出版社</a>
  43. </span>
  44. </p>
  45. <div class="shop_button">
  46. <p class="bottom_p">
  47. <a class="search_btn_cart " name="Buy" dd_name="加入购物车" href="javascript:AddToShoppingCart(25345462)" ddclick="act=normalResult_addToCart&amp;pos=25345462_0_1_q">加入购物车
  48. </a>
  49. <a class="search_btn_collect" name="collect" dd_name="加入收藏" id="lcase25345462" href="javascript:void(0);" ddclick="act=normalResult_favor&amp;pos=25345462_0_1_q">收藏
  50. </a>
  51. </p>
  52. </div>
  53. </li>

目标信息定位与分析

序号要获取的信息定位信息如何定位目标标签
1书名a标签的title属性<a dd_name=“单品图片”]
2网址a标签的href属性<a dd_name=“单品图片”]
3价格span标签的文本内容< span class=“search_now_price”>
4作者p标签内部的第一个a标签的title属性< p class=“search_book_author”>

备注:有些书是没有出版社的,因此本文不爬取出版社信息。

通过观察,可以发现,每个被定为的标签均出现60次【使用ctrl+F,在源代码页面进行页内搜索】,从而可判断,该页面上共有60本书。但每个页面上所放的商品书籍所占的页面面积不同,因此不一定每个页面都准确地有60本书,但会约在60本左右。

代码设计

  1. #本程序需要安装BeautifulSoup库,pandas库
  2. #导入各种需要的模块
  3. from urllib.request import urlopen #查找python的request模块(在标准库urllib里面),只导入一个urlopen函数
  4. from bs4 import BeautifulSoup #导入BeautifulSoup库,该库通过定位HTML标签来组织复杂的网络信息
  5. #定义存放所需信息的列表
  6. author = [] #构造空列表,存放“作者”
  7. price = [] #构造空列表,存放“价格”
  8. book = [] #构造空列表,存放“书名”
  9. link = [] #构造空列表,存放“网址”
  10. #获取单个页面的书名,网址,价格,作者
  11. def onePage(url):
  12. #生成某页面的HTML标签解析树
  13. html = urlopen(url) #打开并读取从网络获得的远程对象,即html页面
  14. bsObj = BeautifulSoup(html,"lxml") #用lxml解析器对该对象html的标签进行解析,生成解析树
  15. #找出该页面的所有作者
  16. p_set = bsObj.findAll("p",{"class":"search_book_author"}) #在解析树中,找出所有的class="search_book_author"的p标签
  17. for p in p_set: #遍历p标签集合,对每个p标签进行提取
  18. a = p.find("a") #提取每个p标签下的子标签中的第一个a标签
  19. author.append(a["title"]) #将a标签的title属性,即作者,放入author列表中
  20. #找出该页面的所有价格
  21. span_set = bsObj.findAll("span",{"class":"search_now_price"}) #在解析树中,找出所有的class="search_now_price"的span标签
  22. for span in span_set: #遍历span标签集合,对每个span标签进行提取
  23. price.append(span.get_text())#span标签的文本内容即价格,放入price列表中
  24. #找出该页面的所有书名和该书的网址
  25. a_set = bsObj.findAll("a",{"dd_name":"单品图片"}) #在解析树中,找出所有的a标签,该标签的属性"dd_name"的属性值是"单品图片"
  26. for a in a_set: #遍历a标签集合,对每个a标签进行提取
  27. book.append(a["title"]) #提取a标签的属性title,即书名,放入列表book中
  28. link.append(a["href"]) #提取a标签的属性href,即该书网址,放入列表link中
  29. #检验是否每个页面的每本书都提取了四个信息,若否,则打印出的四个列表长度不一致
  30. print(len(book))
  31. print(len(link))
  32. print(len(author))
  33. print(len(price))

安装BeautifulSoup库,pandas库

BeautifulSoup库的安装

Win平台:“以管理员身份运行” cmd
执行     pip install beautifulsoup4 pip install bs4)   beautifulsoup4移入到bs4里面去了。
演示HTML页面地址:http://python123.io/ws//demo.html

python -m pip install --upgrade pip(我的pip版本比较旧,就更新了一下)

pandas库的安装

     pip install pandas

(二)、所有目标页面链接分析

目标链接分析

总共要爬取至少300本书的信息,每个页面上共约60本书,所以共须爬取至少5个页面。在当当网中的搜索框,输入”python”,可得到python书籍的搜索结果页面,观察可列出目标页面,如下所示:

http://search.dangdang.com/?key=Linux&act=inputhttp://search.dangdang.com/?key=Linux&act=input&page_index=1

http://search.dangdang.com/?key=Linux&act=input&page_index=2

http://search.dangdang.com/?key=Linux&act=input&page_index=3

http://search.dangdang.com/?key=Linux&act=input&page_index=4

http://search.dangdang.com/?key=Linux&act=input&page_index=5

代码设计

  1. #构造目标链接,共5个
  2. for num in range(1,6):
  3. commonLink ="http://search.dangdang.com/?key=python&act=input&page_index=" #链接的公共部分
  4. url =commonLink+str(num) #链接的不同部分
  5. onePage(url) #对每个页面进行信息提取
  6. #将四个信息列表合并为dataframe,并存到excel中
  7. from pandas.core.frame import DataFrame
  8. merge={"书籍":book, #将四个列表合并成字典
  9. "价格": price,
  10. "作者" : author,
  11. "网址":link}
  12. data=DataFrame(merge) #将字典转换成为数据框
  13. data.to_csv('result.csv') #将数据框存储在当前文件所在的目录下的'result.csv'中

三、注意要点

1.确定每个被定位标签出现次数是一样的。如果不一样,则会出现,“作者”收集到60个,“书名”收集到70个,则结果出错。

2.确定同一个页面中每本书的标签结构都是一样的。若果不一样,则无法通过同一个函数去提取每本书的信息。

3.确定每个页面的标签结构都是一样的。如果不一样,则无法通过同一个函数去爬取所有的目标页面。

四、完整代码

备注:该代码只适合上面的逻辑,若要使用,一定要对代码进行修改,特别是网址部分。

  1. #本程序需要安装BeautifulSoup库,pandas库
  2. #导入各种需要的模块
  3. from urllib.request import urlopen #查找python的request模块(在标准库urllib里面),只导入一个urlopen函数
  4. from bs4 import BeautifulSoup #导入BeautifulSoup库,该库通过定位HTML标签来组织复杂的网络信息
  5. #定义存放所需信息的列表
  6. author = [] #构造空列表,存放“作者”
  7. price = [] #构造空列表,存放“价格”
  8. book = [] #构造空列表,存放“书名”
  9. link = [] #构造空列表,存放“网址”
  10. #获取单个页面的书名,网址,价格,作者
  11. def onePage(url):
  12. #生成某页面的HTML标签解析树
  13. html = urlopen(url) #打开并读取从网络获得的远程对象,即html页面
  14. bsObj = BeautifulSoup(html,"lxml") #用lxml解析器对该对象html的标签进行解析,生成解析树
  15. #找出该页面的所有作者
  16. p_set = bsObj.findAll("p",{"class":"search_book_author"}) #在解析树中,找出所有的class="search_book_author"的p标签
  17. for p in p_set: #遍历p标签集合,对每个p标签进行提取
  18. a = p.find("a") #提取每个p标签下的子标签中的第一个a标签
  19. author.append(a["title"]) #将a标签的title属性,即作者,放入author列表中
  20. #找出该页面的所有价格
  21. span_set = bsObj.findAll("span",{"class":"search_now_price"}) #在解析树中,找出所有的class="search_now_price"的span标签
  22. for span in span_set: #遍历span标签集合,对每个span标签进行提取
  23. price.append(span.get_text())#span标签的文本内容即价格,放入price列表中
  24. #找出该页面的所有书名和该书的网址
  25. a_set = bsObj.findAll("a",{"dd_name":"单品图片"}) #在解析树中,找出所有的a标签,该标签的属性"dd_name"的属性值是"单品图片"
  26. for a in a_set: #遍历a标签集合,对每个a标签进行提取
  27. book.append(a["title"]) #提取a标签的属性title,即书名,放入列表book中
  28. link.append(a["href"]) #提取a标签的属性href,即该书网址,放入列表link中
  29. #检验是否每个页面的每本书都提取了四个信息,若否,则打印出的四个列表长度不一致
  30. print(len(book))
  31. print(len(link))
  32. print(len(author))
  33. print(len(price))
  34. #构造目标链接,共5个
  35. for num in range(1,6):
  36. commonLink ="http://search.dangdang.com/?key=python&act=input&page_index=" #链接的公共部分
  37. url =commonLink+str(num) #链接的不同部分
  38. onePage(url) #对每个页面进行信息提取
  39. #将四个信息列表合并为dataframe,并存到excel中
  40. from pandas.core.frame import DataFrame
  41. merge={"书籍":book, #将四个列表合并成字典
  42. "价格": price,
  43. "作者" : author,
  44. "网址":link}
  45. data=DataFrame(merge) #将字典转换成为数据框
  46. data.to_csv('result.csv') #将数据框存储在当前文件所在的目录下的'result.csv'中


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/825036
推荐阅读
相关标签
  

闽ICP备14008679号