學習了一天的python,終於可以爬爬了-_-
阿新 • • 發佈:2019-02-21
有意 value 中間 需要 eat 存儲 好的 成功 keep
恒久恒久以前在語言大陸就聽過一種叫,人生苦短,我用python的至理名言.陸陸續續在課下和業余生活中學習的一點python,知道基本的語法和規則,不過py的庫實在是太多了,而且許多概念也沒有深入的學習,不過這並不影響使用py,基本上面的知識就可以應對了,工具服務生活,那我就用py來幹有意思的事情了.
環境:
python3.3.6
首先添加依賴包,這裏用到xpath,json,urllib3,有些庫需要自己下載安裝,這網上教程一大堆,就不再贅述了.
from lxml import etree import urllib3, urllib import json import random as rd import os import time
設置請求頭
‘‘‘ 漫畫爬取-請求頭 ‘‘‘ header = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Cache-Control": "no-cache", "Connection": "keep-alive", "Cookie": "", "Host": "", "Pragma": "no-cache", "Referer": "", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36" } ‘‘‘ 請求參數 ‘‘‘ request = { }
‘‘‘ 漫畫主站 ‘‘‘ comicHost = "" ‘‘‘ 漫畫訪問路徑 ‘‘‘ imgTemp = "/action/play/read"
具體網站就不公開了,畢竟是免費的.其他網站的爬取也是大同小異.
‘‘‘ 構造請求參數 t=0.01 id:漫畫id jid:漫畫當前級數 tid:當前圖片數 rand:隨機數 ‘‘‘ imgData = {"id": "", "jid": "", "tid": "", "rand": ""} ‘‘‘ 本地存儲路徑 ‘‘‘ localImgs = "F:\\comic\\" http = urllib3.PoolManager(); ‘‘‘ 分類解析(主站和漫畫首頁) ‘‘‘ urllib3.disable_warnings() def isContain(strUrl): return ".html" in strUrl ‘‘‘ 漫畫首頁html信息 ‘‘‘ bodyContent = ""
‘‘‘ 返回解析數據 ‘‘‘ def requestRemote(url, pattern): res = http.request("GET", url, header) # 保存頁面信息 urlArray = etree.HTML(res.data.decode("utf-8")).xpath(pattern) return urlArray
# 獲取首頁的漫畫鏈接 arrayHtml = requestRemote(comicHost, "//div/ul/li/a/@href") # 去掉下載完成的連接 級數 endArray = [] # 正在操作的漫畫連接 nowOperate = "" endSeries = 0 for url in arrayHtml: if isContain(url): pass else: flag = True for endUrl in endArray: if url == endUrl: flag = False break if flag: descArray = requestRemote(comicHost + url, "//div[@class=‘chapters‘]/ul/li/a/@href") for imgUrl in descArray: # 獲取漫畫id comicId = requestRemote(comicHost + imgUrl, "//div[@class=‘info clearfix‘]/form/input[@id=‘dataid‘]/@value") # 拼接漫畫圖片路徑 imgRealUrl = comicHost + imgTemp # 獲取漫畫級數 sid = imgUrl.split("/")[2].split(".")[0] if url == nowOperate and int(sid) > endSeries: print("略過已經下載的級數..." + sid + "級") continue iid = 1 # 存儲圖片數組 imgArray = [] # 循環獲取圖片 while True: if len(comicId) != 0: imgData = {"did": comicId[0], "id": sid, "jid": id, "rand": rd.random()} print("請求的路徑: " + imgRealUrl + "?" + urllib.parse.urlencode(imgData)) # 得到漫畫的json數據 resJson = http.request("GET", imgRealUrl + "?" + urllib.parse.urlencode(imgData), header) # 判斷漫畫時候為空 JSON解析: JSON字符串中的內容應該用雙引號,而非單引號。 result = json.loads(resJson.data.decode("utf-8"), encoding="utf-8") if result["Code"] == "": break else: imgArray.append(result["Code"]) iid += 1 # 遍歷漫畫 for imgSrc in imgArray: print("圖片開始下載") # 構造圖片本地存儲路徑 title = requestRemote(comicHost + url, "//div[@class=‘info d-item-content‘]/h1") createPath = localImgs + title[0].text.strip() + "\\" + sid + "\\" # 存儲本級漫畫 if os.path.exists(createPath): pass else: os.makedirs(createPath) img = http.request("GET", imgSrc) file = open(createPath + imgSrc.split("/")[6], "wb+") file.write(img.data) print("圖片下載成功! " + time.strftime(‘%Y-%m-%d %H%M%S‘,time.localtime(time.time()))) print("成功保存第" + sid + "級...") else: print("無法獲取漫畫id忽略下載...") break print("結束爬取...")
結果:
這裏面需要註意幾個就可以通用了:
- 所要爬去的具體地址,註意有的地址在網頁上是無法發現的,需要第三方的抓包工具找到具體的請求地址
- 我這裏使用的xpath對網頁進行解析的,這個也比較簡單,安裝看下文檔就可以直接使用了
- 我這裏對照的每個下載的漫畫做了一個過濾免下載,如果中間爬去錯誤的時候,則下載重新進行的時候,忽略其已經下載好的漫畫
# 去掉下載完成的連接 級數
endArray = []
# 正在操作的漫畫連接
nowOperate = ""
endSeries = 0
只需要知道點py的語法,urllib3知識,地方放的文檔解析的插件,人人都可爬蟲
學習了一天的python,終於可以爬爬了-_-