python爬取book118中的书籍
文章目錄
- 前言
 - 新版
 - 網(wǎng)站分析
 - 提取內(nèi)嵌html
 - 分析內(nèi)嵌html
 
- 獲取圖片鏈接
 - 代碼
 
- 下載
 - 合并pdf
 
- 舊版
 - 網(wǎng)站分析
 - 提取內(nèi)嵌html
 - 分析內(nèi)嵌html
 
- 獲取圖片鏈接
 - 代碼展示
 - 運(yùn)行結(jié)果
 
- 下載并合成pdf
 
前言
不滿足于上次從360doc爬取了概率論的答案,這次便研究了一下book118,爬取了里面我需要的答案書。不過由于網(wǎng)站的設(shè)計(jì)比360doc的復(fù)雜,我又不擅長(zhǎng)java的爬蟲,所以這次用python獲取圖片鏈接,接著用之前寫的java下載圖片并合并成pdf。
 2019.8.17
 針對(duì)網(wǎng)站的變化,采取了新的方式進(jìn)行爬取
 完善了python下載圖片并合成pdf的代碼
新版
網(wǎng)站分析
提取內(nèi)嵌html
與舊版不同的是,現(xiàn)在換成了一個(gè)php頁(yè)面進(jìn)行的預(yù)覽。
 
分析內(nèi)嵌html
圖片鏈接也很容易拿到,通過class選擇webpreview-split可以定位到每張圖,再獲取img的src即可。
 
 其實(shí)進(jìn)這個(gè)頁(yè)面就是為了翻頁(yè)的方便,很容易找到翻頁(yè)按鈕,通過class選擇器page-next就可以選中。
 
獲取圖片鏈接
代碼
這里我為了學(xué)習(xí)一下xpath用到了etree,不會(huì)的可以用我之前分析出的class選擇器用beautifulsoup4或者pyquery進(jìn)行元素定位。
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") # 先翻頁(yè) 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 # 解析頁(yè)面數(shù)據(jù)(獲取頁(yè)面中的圖片鏈接) # 創(chuàng)建etree對(duì)象 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]})下載
其實(shí)可以直接不保存到MongoDB,直接下載;不過舊版的鏈接保存到了MongoDB,再接著從MongoDB下載。這里延續(xù)之前的操作,也可以鞏固鞏固自己python讀取MongoDB的操作吧。
import pymongo import requests # 連接MongoDB,創(chuàng)建集合 myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["book118"] mycol = mydb["statistics"] # 遍歷集合 for item in mycol.find():page = item['page'].zfill(3) # 用0補(bǔ)齊,為了合并的時(shí)候字典序不亂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) # 打印未加載出來的頁(yè)面合并pdf
這里直接改了網(wǎng)上的一段代碼
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("實(shí)用多元統(tǒng)計(jì)答案.pdf", "PDF", resolution=100.0, save_all=True, append_images=im_list)舊版
網(wǎng)站分析
提取內(nèi)嵌html
任意打開一本書,開始預(yù)覽全文
 
 F12調(diào)出chrome的控制臺(tái),開始尋找圖片的鏈接
 
 取樣移動(dòng)到圖片上,可以看到這里獲得的就是圖片的鏈接,我們根據(jù)這個(gè)url就能獲得圖片資源了。
 
 為了獲取鏈接的方便,我準(zhǔn)備將預(yù)覽的html提取出來,直接進(jìn)去爬取鏈接。因?yàn)檫@個(gè)預(yù)覽其實(shí)是加載了另一個(gè)html,它的地址如下。 
 
 直接從瀏覽器訪問這個(gè)地址,可以進(jìn)入一個(gè)更簡(jiǎn)潔的預(yù)覽狀態(tài)。
 
分析內(nèi)嵌html
繼續(xù)F12來分析網(wǎng)站,可以發(fā)現(xiàn)圖片在id為ctn的div下,其中的p0、p1、p2即為對(duì)應(yīng)頁(yè)數(shù)。
 
 仔細(xì)查看發(fā)現(xiàn),它并未全部加載完,而且圖片鏈接毫無規(guī)律,所以我打算用selenium翻頁(yè)一張張獲取
 
 不難找到翻頁(yè)按鈕的id
 
 手動(dòng)翻頁(yè)看看,后面的圖片也一點(diǎn)點(diǎn)被加載出來了。
 
 這樣以來根據(jù)id的順序,循環(huán)起來便可以獲得所有的圖片鏈接啦,不再過多分析,上代碼吧。
獲取圖片鏈接
代碼展示
我的代碼只是獲取了所有圖片鏈接并存到MongoDB便于我java去使用,擅長(zhǎng)python的話,可以繼續(xù)用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是內(nèi)嵌的html地址 browser.get('http://view56.book118.com/?readpage=sGIHz3VDh4qjvNC39O3YGA==&furl=o4j9ZG7fK94ywCJ0aQkdUad3YkM4Kc1@bPc_5q6yqfMcdR5aGeBGGEOqooprci7Mc2hNBPV8646vY0GJFEVC47nwNPrDw0CMZ_Z3K6Xglfs=&n=1') # 獲取翻頁(yè)按鈕 nextpage = browser.find_element_by_id('nextBtn') for i in range(0, 220):try:# 獲取相應(yīng)頁(yè)面item = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#p'+str(i))))# 獲取頁(yè)面中的圖片鏈接并打印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("加載出錯(cuò)")break運(yùn)行結(jié)果
可以看到圖片的鏈接都獲取到了
 
 隨便點(diǎn)開一個(gè)查看,就是對(duì)應(yīng)頁(yè)面的圖片,只需要將其下載下即可
 
 220條全都成功存到了MongoDB當(dāng)中
 
下載并合成pdf
關(guān)于合成pdf的操作,我在之前的文檔已經(jīng)演示過;以后有時(shí)間再來完善python的這個(gè)操作。
 https://blog.csdn.net/weixin_44112790/article/details/86775221
 
總結(jié)
以上是生活随笔為你收集整理的python爬取book118中的书籍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: face alignment by 30
 - 下一篇: CSDN博客图片水印|自定义水印|去除水