python爬取book118中的书籍
文章目錄
- 前言
- 新版
- 網站分析
- 提取內嵌html
- 分析內嵌html
- 獲取圖片鏈接
- 代碼
- 下載
- 合并pdf
- 舊版
- 網站分析
- 提取內嵌html
- 分析內嵌html
- 獲取圖片鏈接
- 代碼展示
- 運行結果
- 下載并合成pdf
前言
不滿足于上次從360doc爬取了概率論的答案,這次便研究了一下book118,爬取了里面我需要的答案書。不過由于網站的設計比360doc的復雜,我又不擅長java的爬蟲,所以這次用python獲取圖片鏈接,接著用之前寫的java下載圖片并合并成pdf。
2019.8.17
針對網站的變化,采取了新的方式進行爬取
完善了python下載圖片并合成pdf的代碼
新版
網站分析
提取內嵌html
與舊版不同的是,現在換成了一個php頁面進行的預覽。
分析內嵌html
圖片鏈接也很容易拿到,通過class選擇webpreview-split可以定位到每張圖,再獲取img的src即可。
其實進這個頁面就是為了翻頁的方便,很容易找到翻頁按鈕,通過class選擇器page-next就可以選中。
獲取圖片鏈接
代碼
這里我為了學習一下xpath用到了etree,不會的可以用我之前分析出的class選擇器用beautifulsoup4或者pyquery進行元素定位。
from lxml import etree import time from selenium import webdriver from save_mongo import save_to_mongo browser = webdriver.Chrome()browser.get("https://max.book118.com//index.php?g=Home&m=NewView&a=index&aid=150394748&v=20190731") # 先翻頁 nextpage = browser.find_element_by_class_name('page-next') for i in range(0, 370):nextpage.click()time.sleep(1) # 等待圖片加載 # 再解析 page_text=browser.page_source # 解析頁面數據(獲取頁面中的圖片鏈接) # 創建etree對象 tree = etree.HTML(page_text) div_list = tree.xpath("//div[@class='webpreview-item']") urls = [] # 解析獲取圖片地址和圖片的名稱 for div in div_list:urls.append(div.xpath('.//img/@src')) for i in range(len(urls)):print(urls[i])save_to_mongo("information", {"page": str(i+1), "url": urls[i]})下載
其實可以直接不保存到MongoDB,直接下載;不過舊版的鏈接保存到了MongoDB,再接著從MongoDB下載。這里延續之前的操作,也可以鞏固鞏固自己python讀取MongoDB的操作吧。
import pymongo import requests # 連接MongoDB,創建集合 myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["book118"] mycol = mydb["statistics"] # 遍歷集合 for item in mycol.find():page = item['page'].zfill(3) # 用0補齊,為了合并的時候字典序不亂if len(item['url']) > 0:url = "http:"+item['url'][0]response = requests.get(url)with open('./image/statistics/'+page+'.png', 'wb') as f:f.write(response.content)else:print(page) # 打印未加載出來的頁面合并pdf
這里直接改了網上的一段代碼
import os from PIL import Image # 讀取圖片列表 picPath = "./image/statistics" file_list = os.listdir(picPath) pic_name = [] im_list = [] for x in file_list:if "jpg" in x or 'png' in x or 'jpeg' in x:pic_name.append(picPath+"/"+x) pic_name.sort()# 合并為pdf im1 = Image.open(pic_name[0]) pic_name.pop(0) for i in pic_name:img = Image.open(i)if img.mode == "RGBA":img = img.convert('RGB')im_list.append(img)else:im_list.append(img) im1.save("實用多元統計答案.pdf", "PDF", resolution=100.0, save_all=True, append_images=im_list)舊版
網站分析
提取內嵌html
任意打開一本書,開始預覽全文
F12調出chrome的控制臺,開始尋找圖片的鏈接
取樣移動到圖片上,可以看到這里獲得的就是圖片的鏈接,我們根據這個url就能獲得圖片資源了。
為了獲取鏈接的方便,我準備將預覽的html提取出來,直接進去爬取鏈接。因為這個預覽其實是加載了另一個html,它的地址如下。
直接從瀏覽器訪問這個地址,可以進入一個更簡潔的預覽狀態。
分析內嵌html
繼續F12來分析網站,可以發現圖片在id為ctn的div下,其中的p0、p1、p2即為對應頁數。
仔細查看發現,它并未全部加載完,而且圖片鏈接毫無規律,所以我打算用selenium翻頁一張張獲取
不難找到翻頁按鈕的id
手動翻頁看看,后面的圖片也一點點被加載出來了。
這樣以來根據id的順序,循環起來便可以獲得所有的圖片鏈接啦,不再過多分析,上代碼吧。
獲取圖片鏈接
代碼展示
我的代碼只是獲取了所有圖片鏈接并存到MongoDB便于我java去使用,擅長python的話,可以繼續用python下載這些鏈接的圖片也不算麻煩。
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import Byfrom save_mongo import save_to_mongo #這是我自己封裝的工具包browser = webdriver.Chrome() wait = WebDriverWait(browser, 60) # 這里的url是內嵌的html地址 browser.get('http://view56.book118.com/?readpage=sGIHz3VDh4qjvNC39O3YGA==&furl=o4j9ZG7fK94ywCJ0aQkdUad3YkM4Kc1@bPc_5q6yqfMcdR5aGeBGGEOqooprci7Mc2hNBPV8646vY0GJFEVC47nwNPrDw0CMZ_Z3K6Xglfs=&n=1') # 獲取翻頁按鈕 nextpage = browser.find_element_by_id('nextBtn') for i in range(0, 220):try:# 獲取相應頁面item = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#p'+str(i))))# 獲取頁面中的圖片鏈接并打印img = item.find_element_by_tag_name('img')url = img.get_attribute('src')print(url)# save_to_mongo("book118", {"page": str(i+1), "url": url}) #這是我自己封裝的工具方法nextpage.click()except TimeoutException:print("加載出錯")break運行結果
可以看到圖片的鏈接都獲取到了
隨便點開一個查看,就是對應頁面的圖片,只需要將其下載下即可
220條全都成功存到了MongoDB當中
下載并合成pdf
關于合成pdf的操作,我在之前的文檔已經演示過;以后有時間再來完善python的這個操作。
https://blog.csdn.net/weixin_44112790/article/details/86775221
總結
以上是生活随笔為你收集整理的python爬取book118中的书籍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: face alignment by 30
- 下一篇: ubuntu15.10下安装opencv