目录
- 一、小小课堂
- 二、selenium driver初步尝试控制浏览器
- 三、完整代码
- 四、运行结果
链接:https://search.douban.com/book/subject_search?search_text=python&cat=1001
首先我们需要先找下有没有接口
但是通过查看,我们发现是没有接口的。经过分析,这个网站展示的数据,不能通过之前的方式获取,猜想是通过加密解密得到的内容。这个时候有两种方式 a:找到加密解密的接口,使用python模拟(相当复杂,必须有解析js的能力) b:使用selenium driver直接获取解析后的页面数据内容(这种相对简单)
当然了,我们只是分析了接口这一部分,其实我们通过查看网页源码,使用xpath进行尝试解析,发现其实是可行的,但是由于本文使用的是自动化工具selenium,所以就不过多解释xpath。
在这里,我们使用selenium driver能模拟浏览器找到elements里的内容,这样再提取就没问题了。
接下来我们需要了解一些概念
1.什么是selenium? selenium是网页自动化测试工具,可以自动化的操作浏览器。如果需要操作哪个浏览器需要安装对应的driver,比如你需要通过selenium操作chrome,那必须安装chromedriver,而且版本与chrome保持一致。
2、driver 操作浏览器的驱动,分为有界面和无界面的 有界面:与本地安装好的浏览器一致的driver(用户可以直接观看,交互比如单击、输入) 无界面:phantomjs(看不到,只能通过代码操作,加载速度比有界面的要快)
了解完之后,安装selenium:
代码语言:javascript复制pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
下载driver:
1. phantomjs phantomjs下载网址https://phantomjs.org/download.html
2. chrome谷歌浏览器对应的driver http://npm.taobao.org/mirrors/chromedriver/
下载好之后,放入项目中,方便找到。
二、selenium driver初步尝试控制浏览器
说到模拟,那我们就先来模拟如何打开豆瓣图书并打开Python相关的图书
代码语言:javascript复制from selenium import webdriver
import time
import requests
start_url = "https://book.douban.com/subject_search?search_text=python&cat=1001&start=%s0"
# 控制chrome浏览器
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
# 输入网址
driver.get(start_url)
# 停一下,等待数据加载完毕
time.sleep(2)
# 获取网页内容Elements
content = driver.page_source
# 结束
driver.quit()
?,说明我们能够控制浏览器进行操作,那么这样我们就可以进行下一步操作了。
我们首先先提取数据
代码语言:javascript复制# 获取网页内容Elements
content = driver.page_source
# 提取数据
print(content)
提取到数据后,我们查到里面是否存在我们所要爬取的图书,在此我们以《Python编程 : 从入门到实践》为切入点
这个时候,我们首先要查看这个页面内是否存在有iframe
通过查找,我们发现在我们要爬取的部分是没有iframe存在的,因此我们可以直接使用xpath进行解析。
先查看网页源码,然后尝试解析
1. 解析整体部分
2. 解析书名
3. 解析评分
4.解析其他
?到这里我们就解析完成了,但是我们如果直接这样写的话,其实是有点问题的,问题是什么呢?我们可以看下结果
代码如下:
代码语言:javascript复制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)
我们可以看到标红处,有的数据是获取不到的,这难道是我们代码有问题吗?其实我们的代码并没有问题。我们看下网页
我们可以很清楚的看到,第一个<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)
这个时候,就是我们需要的内容了。内容的问题解决了,下面就需要考虑自动翻页了。
我们通过查看网页的翻页过程,如下:
通过观察翻页部分的网页就够,我们可以以后页为关键词选取其中的href自动翻转到下一页。顺便再加上一个判定如果没有就自动停止。
我们下用xpath进行分析
代码如下
代码语言:javascript复制 # 找到后页
next = driver.find_element_by_xpath('//a[contains(text(),"后页")]')
# 判断
if next.get_attribute("href"):
# 单击
next.click()
else:
# 跳出循环
break
三、完整代码
代码语言:javascript复制# encoding: utf-8
'''
@author 李运辰
@create 2020-11-21 11:34
@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=%s0"
# 控制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()
四、运行结果
- END -