众所周知,爬虫如今是一项非常有用的技能。搜索引擎和新闻媒体网站都需要通过爬取网页来获取信息,现在很火的人工智能和大数据也需要通过爬虫来抓取数据。今天我们就来学习一个简单但是技术栈齐全的爬虫项目来帮助大家入门爬虫技术。

项目设计

为了帮助我们更好地理解和使用爬虫技术,我们要创建一个可以抓取网页资源并将其资源储存在本地电脑的爬虫程序。

豆瓣网站存储了很多的书籍数据,假设我们要创建一个爬虫程序来抓取豆瓣上关于编程的书籍,为了要分析其数据以了解编程书籍中最重要的主题有哪些。那么我们就需要创建一个爬虫程序,将豆瓣网站上关于编程书籍的信息爬取下来,最后存入类似以下的csv文档,其中每行代表一本书籍的信息,包括了书籍名字和简介:

在编写爬虫程序前,我们摸索一下如何通过人工搜索获取这些信息。首先我们可以直接登入这个网站:https://book.douban.com/tag/%E7%BC%96%E7%A8%8B

此网站包含了所有和编程相关的书籍,点击每本书籍,我们就能看到这本书的具体信息:

为了获取不同书籍的信息,我们只要重复以上操作即可。所以根据以上的人工搜索步骤,我们可以设计出爬虫程序的逻辑:

  1. 登入豆瓣编程书籍网站。
  2. 获取页面中每本书籍的名字和相对应的网页链接。
  3. 登入书籍的网络链接,获取书籍的内容简介,并将书名与其简介对应起来(用字典储存书名和简介信息)。
  4. 对每本书籍进行步骤3的操作。
  5. 遍历存好数据的字典,将其数据以特定的格式存入本地的csv文件。

Python 爬虫实现

环境设置

我们要用Python来实现此爬虫,所以我们先确保安装好Python(版本 3.6+),然后要下载Selenium Web Driver,这个Driver可以帮助我们使用Python打开Chrome游览器,以下是Selenium Web Driver安装方式:

从官网下载安装包,选择和Chrome游览器版本对应的安装包:https://chromedriver.chromium.org/downloads

解压安装包,并把chromedriver移到/usr/local/bin

$ mv ~/Downloads/chromedirver /usr/local/bin

然后安装必要的python包:

$ pip install selenium 
$ pip install beautifulsoup4

接下来可以通过以下的代码来测试预备工作是否安装正确,如果运行以下的python代码可以自动打开豆瓣的网页,那么一切就绪,可以编辑python爬虫了:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://book.douban.com/")

代码实现

根据我们的爬虫计划,我们要创建一个DoubanParser类来实现爬虫功能:

import csv
from bs4 import BeautifulSoup
from selenium import webdriver

class DoubanParser:

    driver = webdriver.Chrome()
    book_dict = {}

    def parse(self, page_url):
        self.driver.get(page_url)
        html = self.driver.page_source
        page_soup = BeautifulSoup(html, features='lxml') 
        book_titles = page_soup.find_all('div', {'class': 'info'})
        for title in book_titles:
            book_link = title.h2.a
            title = book_link.get_text().replace(" ", "").replace("\n", "")
            link = book_link["href"]
            print(f'{title}:{link}')
            book_description = self.get_book_description(link)
            self.book_dict[title] = book_description 

    def get_book_description(self, page_url):
        self.driver.get(page_url)
        html = self.driver.page_source
        page_soup = BeautifulSoup(html, features='lxml') 
        book_description = page_soup.find('div', {'class': 'intro'})
        text = book_description.p.get_text()
        return text

    def write_to_csv(self, file_name):
        with open(file_name, 'w', newline='') as file:
            write = csv.writer(file)
            write.writerow(['book_title', 'description'])
            for title, description in self.book_dict.items():
                write.writerow([title, description])

doubanParser = DoubanParser()
new_page = 'https://book.douban.com/tag/%E7%BC%96%E7%A8%8B'
doubanParser.parse(new_page)

doubanParser.write_to_csv('books.csv')

其中 parser 方法的功能就是将网页中的书籍名和每本书对应的网页爬取下来。get_book_description的输入是单本书籍的网页,爬取信息后,输出书籍的简介。方法 write_to_csv 的功能是将存好数据的字典写入本地的 csv 文件。

可见此爬虫的代码其实很简单,大家在本地电脑快速试验一下。如果要了解更多的爬虫细节,可以查看我的视频版本。

源代码链接