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

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

一、任务

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

二、分析

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

源代码分析

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

  •  鸟哥的Linux私房菜 基础学习篇 第四版

    鸟哥的Linux私房菜 基础学习篇 第四版畅销Linux入门书升级版 鸟哥教你从入门到精通 适用Linux系统应用和开发及运维的人员 涵盖linux内核 命令行 嵌入式 Shell与Shell Scripts技巧精粹 基于CentOS 7.x

    ※ 鸟哥倾囊相授,(中简略),内容更加精彩!

    ¥113.30 定价: ¥118.00  (9.61折)

    当当自营

    13条评论

    鸟哥 /2018-11-01 / 人民邮电出版社

  • 目标信息定位与分析

    序号 要获取的信息 定位信息 如何定位目标标签
    1 书名 a标签的title属性
    2 网址 a标签的href属性
    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))
    

    安装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版本比较旧,就更新了一下)

    Python |(爬虫 )爬取当当网书籍信息存到Excel中_第1张图片

    Python |(爬虫 )爬取当当网书籍信息存到Excel中_第2张图片

    pandas库的安装

         pip install pandas

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

    目标链接分析

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

    http://search.dangdang.com/?key=Linux&act=input(http://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

    代码设计

    #构造目标链接,共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)