网络爬虫是一种从互联网上进行开放数据采集的重要手段。本案例通过使用Python的相关模块,开发一个简单的爬虫。实现从某图书网站自动下载感兴趣的图书信息的功能。主要实现的功能包括单页面图书信息下载,图书信息抽取,多页面图书信息下载等。本案例适合大数据初学者了解并动手实现自己的网络爬虫。

1、任务描述和数据来源

从当当网搜索页面,按照关键词搜索,使用Python编写爬虫,自动爬取搜索结果中图书的书名、出版社、价格、作者和图书简介等信息。

当当搜索页面:http://search.dangdang.com/

2、单页面图书信息下载

2.1 网页下载

Python中的 requests 库能够自动帮助我们构造向服务器请求资源的request对象,返回服务器资源的response对象。如果仅仅需要返回HTML页面内容,直接调用response的text属性即可。在下面的代码中,我们首先导入requests库,定义当当网的搜索页面的网址,设置搜索关键词为"机器学习"。然后使用 requests.get 方法获取网页内容。最后将网页的前1000个字符打印显示。

In [12]:
import requests #1. 导入requests 库
test_url = 'http://search.dangdang.com/?key='+ '机器学习'  #2. 设置网页的URL地址
content_page = requests.get(test_url).text #3. 执行页面请求,返回页面内容
print(content_page[:1000]) #4.将页面的前1000个字符打印显示出来
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
        <head>
                <base href="http://search.dangdang.com/Standard/Search/Extend/hosts/" />
<link rel="dns-prefetch" href="http://search.dangdang.com">
<link rel="dns-prefetch" href="http://img4.ddimg.cn">
<title>机器学习-当当网</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<meta name="description" content="当当网在线销售机器学习等商品,并为您购买机器学习等商品提供品牌、价格、图片、评论、促销等选购信息" />
<meta name="keywords" content="机器学习" />
<meta name='ddclick_ab' content="ver:429"/>
<meta name="ddclick_search" content="key:机器学习|cat:|session_id:ff311d3fad5249777be5fdf05af6898a|ab_ver:G|qinfo:31269_1_60|pinfo:_1_60"/>
<link rel="canonical" href="http://search.dangdang.com/?key=%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0"/>
        <link rel="stylesheet" type="text/css" href="cs

2.2 图书内容解析

下面开始做页面的解析,分析源码.这里我使用Chrome浏览器直接打开网址 http://search.dangdang.com/?key=机器学习 。然后选中任意一本图书信息,鼠标右键点击“检查”按钮。不难发现搜索结果中的每一个图书的信息在页面中为<li>标签,如下图所示:

png

点开第一个<li>标签,发现下面还有几个<p>标签,且class分别为"name"、"detail"、"price"等,这些标签下分别存储了商品的书名、详情、价格等信息。

png

我们以书名信息的提取为例进行具体说明。点击 li 标签下的 class属性为 name 的 p 标签,我们发现书名信息保存在一个name属性取值为"itemlist-title"的 a 标签的title属性中,如下图所示:

png

我们可以使用xpath直接描述上述定位信息为 //li/p/a[@name="itemlist-title"]/@title 。下面我们用 lxml 模块来提取页面中的书名信息。xpath的使用请参考 https://www.w3school.com.cn/xpath/xpath_syntax.asp

In [13]:
from lxml import etree #导入etree模块
page = etree.HTML(content_page) #将页面字符串解析成树结构
book_name = page.xpath('//li/p/a[@name="itemlist-title"]/@title') #用xpath提取出书名信息。
book_name[:10] #打印提取出的前10个书名信息
Out[13]:
[' 机器学习 击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著,全面揭开机器学习的奥秘',
 ' 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数据库充分的讲解,不可错过的编 【图灵程序设计丛书】人工智能开发图书 深度学习实践应用 利用Python阐述机器学习算法 配合日常用例 强劲实战导向 程序员人手常备',
 ' 机器学习实战:基于Scikit-Learn和TensorFlow 被称为机器学习图书*强的存在!前谷歌工程师撰写,“美亚”人工智能图书畅销榜首图书!从实践出发,手把手教你从零开始搭建起一个神经网络。',
 ' 机器学习理论导引 ',
 ' 机器学习――原理、算法与应用 全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度学习的原理与应用',
 ' 深度学习 人工智能算法,机器学习奠基之作,AI圣经 AI圣经 deep learning中文版 2018年图灵奖获奖者作品 业内人称“花书” 人工智能机器学习深度学习领域奠基性经典畅销书',
 ' 机器学习中的数学 人工智能深度学习技术丛书 一本有趣、好学的机器学习数学基础知识书籍。300+插图,100+示例,50+公式推导,讲故事与实例相结合,学习不枯燥,赠送全书源代码。',
 ' 白话机器学习的数学 ',
 ' 机器学习线性代数基础:Python语言描述 线性代数是机器学习的基石,本书从5个维度+60段代码+53幅图表+2个项目,帮助你理解线性代数与机器学习紧密结合的核心内容,并以Python语言为工具进行数学思想和解决方案的有效实践。',
 ' 机器学习(决战大数据时代!IT技术人员不得不读!) ']

同理,我们可以提取图书的出版信息(作者、出版社、出版时间等),当前价格、星级、评论数等更多的信息。这些信息对应的xpath路径如下表所示。

信息项 xpath路径
书名 //li/p/a[@name="itemlist-title"]/@title
出版信息 //li/p[@class="search_book_author"]
当前价格 //li/p[@class="price"]/span[@class="search_now_price"]/text()
星级 //li/p[@class="search_star_line"]/span[@class="search_star_black"]/span/@style
评论数 //li/p[@class="search_star_line"]/a[@class="search_comment_num"]/text()

下面我们编写一个函数 extract_books_from_content,输入一个页面内容,自动提取出页面包含的所有图书信息。

In [14]:
from lxml import etree
def extract_books_from_content(content_page):
    books = []
    page = etree.HTML(content_page)
    book_name = page.xpath('//li/p/a[@name="itemlist-title"]/@title') #书名
    pub_info = page.xpath('//li/p[@class="search_book_author"]')#出版信息
    pub_info = [book_pub.xpath('string(.)') for book_pub in pub_info]
    price_now = page.xpath('//li//span[@class="search_now_price"]/text()')#当前价格
    stars = page.xpath('//li/p[@class="search_star_line"]/span[@class="search_star_black"]/span/@style') #星级
    comment_num = page.xpath('//li/p[@class="search_star_line"]/a[@class="search_comment_num"]/text()') #评论数
    for book in zip(book_name, pub_info, price_now, stars, comment_num):
        books.append(list(book))
    return books
books = extract_books_from_content(content_page)
books[:5]
Out[14]:
[[' 机器学习 击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著,全面揭开机器学习的奥秘',
  '周志华 /2016-01-01  /清华大学出版社',
  '¥61.60',
  'width: 90%;',
  '76175条评论'],
 [' 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数据库充分的讲解,不可错过的编 【图灵程序设计丛书】人工智能开发图书 深度学习实践应用 利用Python阐述机器学习算法 配合日常用例 强劲实战导向 程序员人手常备',
  '[美]哈林顿 /2013-06-01  /人民邮电出版社',
  '¥46.30',
  'width: 90%;',
  '25258条评论'],
 [' 机器学习实战:基于Scikit-Learn和TensorFlow 被称为机器学习图书*强的存在!前谷歌工程师撰写,“美亚”人工智能图书畅销榜首图书!从实践出发,手把手教你从零开始搭建起一个神经网络。',
  '(法)奥雷利安・杰龙(Aurélien Géron) /2018-08-27  /机械工业出版社',
  '¥83.30',
  'width: 90%;',
  '5768条评论'],
 [' 机器学习理论导引 ',
  '周志华 王魏 高尉 张利军 /2020-05-30  /机械工业出版社',
  '¥62.30',
  'width: 100%;',
  '813条评论'],
 [' 机器学习――原理、算法与应用 全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度学习的原理与应用',
  '雷明 /2019-09-01  /清华大学出版社',
  '¥44.00',
  'width: 90%;',
  '1187条评论']]

为了显示的方便,我们将上述提取到的图书信息转换成 Pandas 的 DataFrame 格式。

In [15]:
import pandas as pd
books_df = pd.DataFrame(data=books,columns=["书名","出版信息","当前价格","星级","评论数"])
books_df[:10]
Out[15]:
书名 出版信息 当前价格 星级 评论数
0 机器学习 击败AlphaGo的武林秘籍,赢得人机大战的必由之路:人工智能大牛周志华教授巨著... 周志华 /2016-01-01 /清华大学出版社 ¥61.60 width: 90%; 76175条评论
1 机器学习实战【python基础教程指南,python核心编程实例指导,对wxpython数... [美]哈林顿 /2013-06-01 /人民邮电出版社 ¥46.30 width: 90%; 25258条评论
2 机器学习实战:基于Scikit-Learn和TensorFlow 被称为机器学习图书*强的... (法)奥雷利安・杰龙(Aurélien Géron) /2018-08-27 /机械工业出版社 ¥83.30 width: 90%; 5768条评论
3 机器学习理论导引 周志华 王魏 高尉 张利军 /2020-05-30 /机械工业出版社 ¥62.30 width: 100%; 813条评论
4 机器学习――原理、算法与应用 全书深入浅出,兼具广度与深度,帮助读者真正掌握机器学习、深度... 雷明 /2019-09-01 /清华大学出版社 ¥44.00 width: 90%; 1187条评论
5 深度学习 人工智能算法,机器学习奠基之作,AI圣经 AI圣经 deep learning中... [美]Ian Goodfellow(伊恩・古德费洛)、[ /2017-07-01 /人民邮... ¥118.50 width: 80%; 55557条评论
6 机器学习中的数学 人工智能深度学习技术丛书 一本有趣、好学的机器学习数学基础知识书籍。30... 孙博 编著 /2019-11-01 /水利水电出版社 ¥44.50 width: 100%; 1990条评论
7 白话机器学习的数学 [日]立石贤吾 /2020-06-01 /人民邮电出版社 ¥41.50 width: 100%; 142条评论
8 机器学习线性代数基础:Python语言描述 线性代数是机器学习的基石,本书从5个维度+60... 张雨萌 /2019-08-12 /北京大学出版社 ¥37.90 width: 100%; 1664条评论
9 机器学习(决战大数据时代!IT技术人员不得不读!) (美)米歇尔(Mitchell,T.M.) 著;曾华军 等译 /2008-03-01 /机... ¥24.40 width: 90%; 7745条评论
In [16]:
books_df.shape
Out[16]:
(60, 5)

2.3 图书数据存储

上一小节我们已经成功从网页中提取出了图书的信息,并且转换成了 DataFrame 格式。可以选择将这些图书信息保存为 CSV 文件,Excel 文件,也可以保存在数据库中。这里我们使用 DataFrame 提供的 to_csv 方法保存为CSV文件。

In [17]:
books_df.to_csv("./input/books_test.csv",index=None)

3、多页面图书信息下载

观察搜索页面最底部,输入一个关键词,通常会返回多页结果,点击任意一个页面按钮,然后观察浏览器地址栏的变化。我们发现不同页面通过浏览器URL中添加 page_index 属性即可。例如我们搜索"机器学习"关键词,访问第10页结果,则使用以下URL:

http://search.dangdang.com/?key=机器学习&page_index=10

假设我们一共希望下载10页内容,则可以通过以下代码实现。

In [18]:
import time
key_word = "机器学习" #设置搜索关键词
max_page = 10 #需要下载的页数
books_total = []
for page in range(1,max_page+1):
    url = 'http://search.dangdang.com/?key=' + key_word + "&page_index=" + str(page) #构造URL地址
    page_content = requests.get(url).text #下载网页内容
    books = extract_books_from_content(page_content) #网页图书信息解析
    books_total.extend(books) #将当前页面的图书信息添加到结果列表
    print("page " + str(page) +", "+ str(len(books)) + " books downloaded." )
    time.sleep(10) #停顿10秒再下载下一页
page 1, 60 books downloaded.
page 2, 60 books downloaded.
page 3, 60 books downloaded.
page 4, 60 books downloaded.
page 5, 60 books downloaded.
page 6, 60 books downloaded.
page 7, 60 books downloaded.
page 8, 60 books downloaded.
page 9, 60 books downloaded.
page 10, 60 books downloaded.

转换成DataFrame格式。

In [19]:
books_total_df = pd.DataFrame(data=books_total, columns=["书名","出版信息","当前价格","星级","评论数"])

随机抽样5个图书显示。

In [20]:
books_total_df.sample(5)
Out[20]:
书名 出版信息 当前价格 星级 评论数
79 机器学习:贝叶斯和优化方法(英文版) 畅读原版机器学习经典著作,在全景式知识体系中融会传统... (希)西格尔斯・西奥多里蒂斯 /2017-05-22 /机械工业出版社 ¥212.50 width: 100%; 385条评论
576 实用机器学习 孙亮,黄倩 /2017-05-01 /人民邮电出版社 ¥22.99 width: 0%; 24条评论
411 机器学习系统设计:Python语言实现 【正版图书,质量保证,可开发票,放心购买】 [美] 戴维・朱利安(David Julian),李洋 /2017-06-01 /机械工业出版社 ¥32.00 width: 0%; 0条评论
596 R语言机器学习 第2版 (美)布雷特・兰茨 9787564170714 (美)布雷特・兰茨 /2017-04-01 /东南大学出版社 ¥111.00 width: 0%; 0条评论
181 深入理解机器学习:从原理到算法 近几年机器学习理论方面的优秀著作,全面清晰地讨论了机器学习... [以] 沙伊・沙莱夫-施瓦茨 /2016-07-18 /机械工业出版社 ¥55.20 width: 90%; 1838条评论
In [21]:
books_total_df.shape
Out[21]:
(600, 5)

将图书信息保存为文件。

In [24]:
books_total_df.to_csv("./input/books_total.csv",encoding="utf8",sep="\t",index=None)

4 总结和展望

借助Python的 requests, lxml, Pandas等工具,我们已经实现了一个简单的网络爬虫。能够从当当网按照关键词搜索图书,将图书信息页面下载,并从页面中解析出结构化的图书信息。最后将解析出的图书信息保存为了CSV格式的文件。

  • 你能够修改本案例的代码,通过设置其他关键词,下载你自己感兴趣的图书信息吗?

  • 本案例中,我们设置下载页数为10,你有什么办法能够自动获取返回的页面数量?