??大家好,我是不溫卜火,是一名計算機學院大資料專業大三的學生,昵稱來源于成語—
不溫不火,本意是希望自己性情溫和,作為一名互聯網行業的小白,博主寫博客一方面是為了記錄自己的學習程序,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處于起步階段的萌新,但由于水平有限,博客中難免會有一些錯誤出現,有紕漏之處懇請各位大佬不吝賜教!暫時只在csdn這一個平臺進行更新,博客主頁:https://buwenbuhuo.blog.csdn.net/,
PS:由于現在越來越多的人未經本人同意直接爬取博主本人文章,博主在此特別宣告:未經本人允許,禁止轉載!!!
目錄
- 一、小小課堂
- 二、selenium+driver初步嘗試控制瀏覽器
- 三、完整代碼
- 四、運行結果

一、小小課堂

由于只是屬于教學性質,學長本人在此以就以爬取Python相關的圖書為例!
鏈接: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:
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相關的圖書
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()

🆗,說明我們能夠控制瀏覽器進行操作,那么這樣我們就可以進行下一步操作了,

我們首先先提取資料
# 獲取網頁內容Elements
content = driver.page_source
# 提取資料
print(content)

提取到資料后,我們查到里面是否存在我們所要爬取的圖書,在此我們以《Python編程 : 從入門到實踐》為切入點

這個時候,我們首先要查看這個頁面內是否存在有iframe

通過查找,我們發現在我們要爬取的部分是沒有iframe存在的,因此我們可以直接使用xpath進行決議,

先查看網頁原始碼,然后嘗試決議
- 1. 決議整體部分

- 2. 決議書名

- 3. 決議評分

- 4.決議其他

🆗到這里我們就決議完成了,但是我們如果直接這樣寫的話,其實是有點問題的,問題是什么呢?我們可以看下結果

代碼如下:
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進行分析

代碼如下
# 找到后頁
next = driver.find_element_by_xpath('//a[contains(text(),"后頁")]')
# 判斷
if next.get_attribute("href"):
# 單擊
next.click()
else:
# 跳出回圈
break
三、完整代碼

# 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()
四、運行結果




美好的日子總是短暫的,雖然還想繼續與大家暢談,但是本篇博文到此已經結束了,如果還嫌不夠過癮,不用擔心,我們下篇見!

??好書不厭讀百回,熟讀課思子自知,而我想要成為全場最靚的仔,就必須堅持通過學習來獲取更多知識,用知識改變命運,用博客見證成長,用行動證明我在努力,
??如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論”“收藏”一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看,
??碼字不易,大家的支持就是我堅持下去的動力,點贊后不要忘了關注我哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/197675.html
標籤:其他
上一篇:Python快速統計檔案中高頻詞



