今天看啥  ›  专栏  ›  不温卜火

爬虫入门经典(十四) | 使用selenium尝试爬取豆瓣图书

不温卜火  · CSDN  ·  · 2020-10-31 06:15

大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语— 不温不火 ,本意是 希望自己性情温和 。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页: https://buwenbuhuo.blog.csdn.net/
1

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!


2


一、小小课堂

30
由于只是属于教学性质,学长本人在此以就以爬取Python相关的图书为例!

链接: https://search.douban.com/book/subject_search?search_text=python&cat=1001
3
31
首先我们需要先找下有没有接口
4
但是通过查看,我们发现是没有接口的。经过分析,这个网站展示的数据,不能通过之前的方式获取,猜想是通过加密解密得到的内容。这个时候有两种方式
a:找到加密解密的接口,使用python模拟(相当复杂,必须有解析js的能力)
b:使用selenium+driver直接获取解析后的页面数据内容(这种相对简单)
32
当然了,我们只是分析了接口这一部分,其实我们通过查看网页源码,使用xpath进行尝试解析,发现其实是可行的,但是由于本篇博文使用的是自动化工具selenium,所以就不过多解释xpath。
5
在这里,我们使用selenium+driver能模拟浏览器找到elements里的内容,这样再提取就没问题了。
6
33
接下来我们需要了解一些概念

  • 1.什么是selenium?
    selenium是网页自动化测试工具,可以自动化的操作浏览器。如果需要操作哪个浏览器需要安装对应的driver,比如你需要通过selenium操作chrome,那必须安装chromedriver,而且版本与chrome保持一致。

  • 2、driver
    操作浏览器的驱动,分为有界面和无界面的
    有界面:与本地安装好的浏览器一致的driver(用户可以直接观看,交互比如单击、输入)
    无界面:phantomjs(看不到,只能通过代码操作,加载速度比有界面的要快)

了解完之后,安装selenium:

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 1
  • 1

下载driver:
34

下载好之后,放入项目中,方便找到。
10

二、selenium+driver初步尝试控制浏览器

35
说到模拟,那我们就先来模拟如何打开豆瓣图书并打开Python相关的图书

from selenium import webdriver
import time
import requests

start_url = "https://book.douban.com/subject_search?search_text=python&cat=1001&start=%25s0"

# 控制chrome浏览器
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
# 输入网址
driver.get(start_url)

# 停一下,等待数据加载完毕
time.sleep(2)
# 获取网页内容Elements
content = driver.page_source
# 结束
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

11
🆗,说明我们能够控制浏览器进行操作,那么这样我们就可以进行下一步操作了。
36
我们首先先提取数据

# 获取网页内容Elements
content = driver.page_source

# 提取数据
print(content)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

12
提取到数据后,我们查到里面是否存在我们所要爬取的图书,在此我们以《Python编程 : 从入门到实践》为切入点
13
这个时候,我们首先要查看这个页面内是否存在有iframe
14
通过查找,我们发现在我们要爬取的部分是没有iframe存在的,因此我们可以直接使用xpath进行解析。
37
先查看网页源码,然后尝试解析

  • 1. 解析整体部分
    15
  • 2. 解析书名
    16
  • 3. 解析评分
    17
  • 4.解析其他
    18
    🆗到这里我们就解析完成了,但是我们如果直接这样写的话,其实是有点问题的,问题是什么呢?我们可以看下结果
    38
    代码如下:
data_list = etree.HTML(content).xpath('//div[@class="item-root"]')
# print(data_list)
for data in data_list:
    item = {}
    item["name"] = data.xpath("./div/div[1]/a/text()")
    item["score"] = data.xpath("./div/div[2]/span[2]/text()")
    item["others"] = data.xpath("./div/div[3]/text()")
    print(item)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

19
我们可以看到标红处,有的数据是获取不到的,这难道是我们代码有问题吗?其实我们的代码并没有问题。我们看下网页
39
20
我们可以很清楚的看到,第一个 <div class = "item-root"></div> 并不是我们所要找的书籍,因此我们可以从第二个进行爬取。
修改后的代码如下

data_list = etree.HTML(content).xpath('//div[@class="item-root"]')[1:]
# print(data_list)
for data in data_list:
    item = {}
    item["name"] = data.xpath("./div/div[1]/a/text()")[0]
    item["score"] = data.xpath("./div/div[2]/span[2]/text()")[0]
    item["others"] = data.xpath("./div/div[3]/text()")[0]
    print(item)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

21
这个时候,就是我们需要的内容了。内容的问题解决了,下面就需要考虑自动翻页了。
40
我们通过查看网页的翻页过程,如下:
22
通过观察翻页部分的网页就够,我们可以以后页为关键词选取其中的href自动翻转到下一页。顺便再加上一个判定如果没有就自动停止。

我们下用xpath进行分析
23

代码如下

    # 找到后页
    next = driver.find_element_by_xpath('//a[contains(text(),"后页")]')
    # 判断
    if next.get_attribute("href"):
        # 单击
        next.click()
    else:
        # 跳出循环
        break
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三、完整代码

41

# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-09 11:34
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 豆瓣图书.py
  @Version:1.0
  
'''
from selenium import webdriver
from lxml import etree
import os
import time
import requests
import re
import csv

start_url = "https://book.douban.com/subject_search?search_text=python&cat=1001&start=%25s0"

# 控制chrome浏览器
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
# 输入网址
driver.get(start_url)
while True:
    # 停一下,等待加载完毕
    time.sleep(2)
    # 获取网页内容Elements
    content = driver.page_source
    # 提取数据
    data_list = etree.HTML(content).xpath('//div[@class="item-root"]')[1:]
    for data in data_list:
        item = {}
        item["name"] = data.xpath("./div/div[1]/a/text()")[0]
        item["score"] = data.xpath("./div/div[2]/span[2]/text()")[0]
        with open("./豆瓣图书.csv", "a", encoding="utf-8") as file:
            writer = csv.writer(file)
            writer.writerow(item.values())
        print(item)
    # 找到后页
    next = driver.find_element_by_xpath('//a[contains(text(),"后页")]')
    # 判断
    if next.get_attribute("href"):
        # 单击
        next.click()
    else:
        # 跳出循环
        break
# 结束
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

四、运行结果

42
24
25

26

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


27

好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论”“收藏” 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!
28
29




原文地址:访问原文地址
快照地址: 访问文章快照