赞
踩
获取当当网上至少300本书【均为某类书,如python相关的书籍,或概率论相关的书籍】的信息,包括书名,网址,价格,作者,并存在excel表格中。
在当当网的搜索框输入“python”,出现搜索页面,并查看源代码。
<li ddt-pit="3" class="line3" id="p25333314"> <a title="Python从菜鸟到高手" ddclick="act=normalResult_picture&pos=25333314_2_1_q" class="pic" name="itemlist-picture" dd_name="单品图片"href="http://product.dangdang.com/25333314.html" target="_blank" > <!--a标签的title中是书名信息,href中是网址信息,且对于每本书都是这样。而只有该标签才有 dd_name="单品图片" 的属性值--> <img data-original='http://img3m4.ddimg.cn/6/6/25333314-1_b_2.jpg' src='images/model/guan/url_none.png' alt=' Python从菜鸟到高手'/> </a> <p class="name" name="title" > <a title=" Python从菜鸟到高手JetBrains官方推荐图书!JetBrains官大中华区市场部经理赵磊作序!送2400分钟同步视频课程!500个案例,400道Python练习题,电子书,10万行源代码,6个实战项目!" href="http://product.dangdang.com/25333314.html"ddclick="act=normalResult_title&pos=25333314_2_1_q"name="itemlist-title" dd_name="单品标题"target="_blank" > <font class="skcolor_ljg">Python</font>从菜鸟到高手JetBrains官方推荐图书!JetBrains官大中华区市场部经理赵磊作序!送2400分钟同步视频课程!500个案例,400道Python练习题,电子书,10万行源代码,6个实战项目! </a> </p> <p class="detail" >JetBrains官方推荐图书!JetBrains官大中华区市场部经理赵磊作序!送2400分钟同步视频课程!500个案例,400道Python练习题,电子书,10万行源代码,6个实战项目! 李宁 私房菜谱 : ? Python语法基础 ? Python高级编程 ? Python Web开发 ? Python科学计算与数据分析 ? Python Web爬虫技术 ? Python项目实战 李宁 实战项目 : ? Web项目实战:基于Flask的美团网 ? Web项目实战:基于Django的58同城 ? 爬虫项目实战:天气预报服务API ? 爬虫项目实战:胸罩销售数据分析 ? GUI项目实战:动态修改域名指向的IP ? 游戏项目实战:俄罗斯方块 </p> <p class="price" > <span class="search_now_price">¥112.60 </span> <!--span标签的内容是价格信息,且对于每本书都是这样。而只有该标签才有 class="search_now_price" 的属性值--> <a class="search_discount"style="text-decoration:none;">定价: </a> <span class="search_pre_price">¥128.00 </span> <span class="search_discount"> (8.8折) </span> </p> <div class="lable_label"> <span class="new_lable" y=""> </span> </div> <p class="search_star_line" > <span class="search_star_black"> <span style="width: 100%;"> </span> </span> <a href="http://product.dangdang.com/25333314.html?point=comment_point" target="_blank" name="itemlist-review" dd_name="单品评论" class="search_comment_num" ddclick="act=click_review_count&pos=25333314_2_1_q">22条评论 </a> </p> <span class="tag_box"> </span> <p class="search_book_author"> <span> <a href='http://search.dangdang.com/?key2=李宁&medium=01&category_path=01.00.00.00.00.00' name='itemlist-author' dd_name='单品作者' title='李宁'>李宁 </a> <!--a标签的title是作者信息,且对于每本书都是这样。但该标签没有唯一的可以定位的属性值--> <!--a标签父标签p有唯一的属性class="search_book_author"--> </span> <span > /2018-09-01 </span> <span> / <a href='http://search.dangdang.com/?key=&key3=%C7%E5%BB%AA%B4%F3%D1%A7%B3%F6%B0%E6%C9%E7&medium=01&category_path=01.00.00.00.00.00' name='P_cbs' dd_name='单品出版社' title='清华大学出版社'>清华大学出版社 </a> </span> <div class="shop_button"> <p class="bottom_p"> <a class='search_btn_cart' name='Buy' dd_name='加入购物车' href='javascript:AddToShoppingCart(25333314)'ddclick='act=normalResult_addToCart&pos=25333314_2_1_q'>加入购物车 </a> <a class='search_btn_collect' name='collect' dd_name='加入收藏' id="lcase25333314" href="javascript:void(0);"name="Sc" ddclick='act=normalResult_favor&pos=25333314_2_1_q'>收藏 </a> </p> </div> </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本左右。
#本程序需要安装BeautifulSoup库,pandas库 #导入各种需要的模块 from urllib.request import urlopen #查找python的request模块(在标准库urllib里面),只导入一个urlopen函数 from bs4 import BeautifulSoup #导入BeautifulSoup库,该库通过定位HTML标签来组织复杂的网络信息 #定义存放所需信息的列表 author = [] #构造空列表,存放“作者” price = [] #构造空列表,存放“价格” book = [] #构造空列表,存放“书名” link = [] #构造空列表,存放“网址” #获取单个页面的书名,网址,价格,作者 def onePage(url): #生成某页面的HTML标签解析树 html = urlopen(url) #打开并读取从网络获得的远程对象,即html页面 bsObj = BeautifulSoup(html,"lxml") #用lxml解析器对该对象html的标签进行解析,生成解析树 #找出该页面的所有作者 p_set = bsObj.findAll("p",{"class":"search_book_author"}) #在解析树中,找出所有的class="search_book_author"的p标签 for p in p_set: #遍历p标签集合,对每个p标签进行提取 a = p.find("a") #提取每个p标签下的子标签中的第一个a标签 author.append(a["title"]) #将a标签的title属性,即作者,放入author列表中 #找出该页面的所有价格 span_set = bsObj.findAll("span",{"class":"search_now_price"}) #在解析树中,找出所有的class="search_now_price"的span标签 for span in span_set: #遍历span标签集合,对每个span标签进行提取 price.append(span.get_text())#span标签的文本内容即价格,放入price列表中 #找出该页面的所有书名和该书的网址 a_set = bsObj.findAll("a",{"dd_name":"单品图片"}) #在解析树中,找出所有的a标签,该标签的属性"dd_name"的属性值是"单品图片" for a in a_set: #遍历a标签集合,对每个a标签进行提取 book.append(a["title"]) #提取a标签的属性title,即书名,放入列表book中 link.append(a["href"]) #提取a标签的属性href,即该书网址,放入列表link中 #检验是否每个页面的每本书都提取了四个信息,若否,则打印出的四个列表长度不一致 print(len(book)) print(len(link)) print(len(author)) print(len(price))
总共要爬取至少300本书的信息,每个页面上共约60本书,所以共须爬取至少5个页面。在当当网中的搜索框,输入”python”,可得到python书籍的搜索结果页面,观察可列出目标页面,如下所示:
http://search.dangdang.com/?key=python&act=input
http://search.dangdang.com/?key=python&act=input&page_index=2
http://search.dangdang.com/?key=python&act=input&page_index=3
http://search.dangdang.com/?key=python&act=input&page_index=4
http://search.dangdang.com/?key=python&act=input&page_index=5
可观察到,除了首页,其他目标页面的链接表达式具有规律性。但其实,可以猜测,首页的链接等同于 http://search.dangdang.com/?key=python&act=input&page_index=1,事实确实如此。
#构造目标链接,共5个
for num in range(1,6):
commonLink ="http://search.dangdang.com/?key=python&act=input&page_index=" #链接的公共部分
url =commonLink+str(num) #链接的不同部分
onePage(url) #对每个页面进行信息提取
#将四个信息列表合并为dataframe,并存到excel中
from pandas.core.frame import DataFrame
merge={"书籍":book, #将四个列表合并成字典
"价格": price,
"作者" : author,
"网址":link}
data=DataFrame(merge) #将字典转换成为数据框
data.to_csv('result.csv') #将数据框存储在当前文件所在的目录下的'result.csv'中
1.确定每个被定位标签出现次数是一样的。如果不一样,则会出现,“作者”收集到60个,“书名”收集到70个,则结果出错。
2.确定同一个页面中每本书的标签结构都是一样的。若果不一样,则无法通过同一个函数去提取每本书的信息。
3.确定每个页面的标签结构都是一样的。如果不一样,则无法通过同一个函数去爬取所有的目标页面。
备注:该代码只适合上面的逻辑,若要使用,一定要对代码进行修改,特别是网址部分。
#本程序需要安装BeautifulSoup库,pandas库 #导入各种需要的模块 from urllib.request import urlopen #查找python的request模块(在标准库urllib里面),只导入一个urlopen函数 from bs4 import BeautifulSoup #导入BeautifulSoup库,该库通过定位HTML标签来组织复杂的网络信息 #定义存放所需信息的列表 author = [] #构造空列表,存放“作者” price = [] #构造空列表,存放“价格” book = [] #构造空列表,存放“书名” link = [] #构造空列表,存放“网址” #获取单个页面的书名,网址,价格,作者 def onePage(url): #生成某页面的HTML标签解析树 html = urlopen(url) #打开并读取从网络获得的远程对象,即html页面 bsObj = BeautifulSoup(html,"lxml") #用lxml解析器对该对象html的标签进行解析,生成解析树 #找出该页面的所有作者 p_set = bsObj.findAll("p",{"class":"search_book_author"}) #在解析树中,找出所有的class="search_book_author"的p标签 for p in p_set: #遍历p标签集合,对每个p标签进行提取 a = p.find("a") #提取每个p标签下的子标签中的第一个a标签 author.append(a["title"]) #将a标签的title属性,即作者,放入author列表中 #找出该页面的所有价格 span_set = bsObj.findAll("span",{"class":"search_now_price"}) #在解析树中,找出所有的class="search_now_price"的span标签 for span in span_set: #遍历span标签集合,对每个span标签进行提取 price.append(span.get_text())#span标签的文本内容即价格,放入price列表中 #找出该页面的所有书名和该书的网址 a_set = bsObj.findAll("a",{"dd_name":"单品图片"}) #在解析树中,找出所有的a标签,该标签的属性"dd_name"的属性值是"单品图片" for a in a_set: #遍历a标签集合,对每个a标签进行提取 book.append(a["title"]) #提取a标签的属性title,即书名,放入列表book中 link.append(a["href"]) #提取a标签的属性href,即该书网址,放入列表link中 #检验是否每个页面的每本书都提取了四个信息,若否,则打印出的四个列表长度不一致 print(len(book)) print(len(link)) print(len(author)) print(len(price)) #构造目标链接,共5个 for num in range(1,6): commonLink ="http://search.dangdang.com/?key=python&act=input&page_index=" #链接的公共部分 url =commonLink+str(num) #链接的不同部分 onePage(url) #对每个页面进行信息提取 #将四个信息列表合并为dataframe,并存到excel中 from pandas.core.frame import DataFrame merge={"书籍":book, #将四个列表合并成字典 "价格": price, "作者" : author, "网址":link} data=DataFrame(merge) #将字典转换成为数据框 data.to_csv('result.csv') #将数据框存储在当前文件所在的目录下的'result.csv'中
《python网络数据采集》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。