Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
1 前言/
平時(shí)我們要下載圖片,要要一個(gè)一個(gè)點(diǎn)擊下載是不是覺得很麻煩?那有沒有更加簡(jiǎn)便的方法呢?答案是肯定的,這里我們以天堂網(wǎng)為例,批量下載天堂網(wǎng)的圖片。
/2 項(xiàng)目準(zhǔn)備工作/
首先 我們第一步我們要安裝一個(gè)pycham的軟件。可以參考這篇文章:Python環(huán)境搭建—安利Python小白的Python和Pycharm安裝詳細(xì)教程。
天堂網(wǎng)的網(wǎng)址:
https://www.ivsky.com/bizhi/1920x1080/
我們需要下載幾個(gè)庫(kù),怎么下載呢?打開pycharm,依次點(diǎn)擊File,再點(diǎn)開Settings,如下圖所示。
打開后會(huì)出現(xiàn)這個(gè)界面點(diǎn)擊你的項(xiàng)目名字(project:(你的項(xiàng)目名字)),之后在project interpreter下,點(diǎn)擊加號(hào),而后下載我們需要的庫(kù),如下圖所示。
本項(xiàng)目需要用到的是庫(kù)是requests、lxml、fake_useragent,如下圖所示。fake_useragent一般是沒有的,需要通過下面的命令進(jìn)行安裝:
pip install fake_useragent
/3 項(xiàng)目實(shí)現(xiàn)/
1、導(dǎo)入需要的庫(kù)(requests,lxml, fake_useragent)。
2、我用了封裝方法去實(shí)現(xiàn)各個(gè)部分的功能。首先要寫一個(gè)框架:構(gòu)造一個(gè)類TianTangWebsite ,然后定義一個(gè)init方法里繼承(self),再定義一個(gè)主方法(main)。最后實(shí)現(xiàn)這個(gè)main方法,依次一步一步進(jìn)行實(shí)現(xiàn)。
3、我們把天堂網(wǎng)的網(wǎng)址拿過來,構(gòu)造請(qǐng)求頭。這里說一下這個(gè)UserAgent的獲取方法。在打開天堂網(wǎng)的網(wǎng)站后,按下鍵盤上的F12鍵,之后會(huì)進(jìn)入到開發(fā)者模式,之后點(diǎn)開network,如下圖所示。
4、而后隨便點(diǎn)擊一個(gè)name,復(fù)制header里邊的UserAgent就可以了。
5、我們點(diǎn)擊下一頁(yè)的地址觀察網(wǎng)址的變化,如下所示:
https://www.ivsky.com/bizhi/1920x1080/index_2.html
https://www.ivsky.com/bizhi/1920x1080/index_3.html
https://www.ivsky.com/bizhi/1920x1080/index_4.html
很明顯的發(fā)現(xiàn),這個(gè)網(wǎng)址的網(wǎng)頁(yè)數(shù)字一直在變化。我們可以用格式化{}去代替變化的值,類似這樣:
https://www.ivsky.com/bizhi/1920x1080/index_{}.html
6、然后我們用for循環(huán)去遍歷這些網(wǎng)址,代碼如下所示:
def main(self):
for i in range(1,2):#頁(yè)數(shù)隨機(jī)客戶隨便 設(shè)置
url=self.url.format(i)
print(url)
7、我們定義這個(gè)get_home()方法去請(qǐng)求到這個(gè)網(wǎng)址。
9、我們需要解析得到的數(shù)據(jù),接下來定義一個(gè)xiap的方法,拿到我們請(qǐng)求的網(wǎng)址。接下來就是該項(xiàng)目的關(guān)鍵了。
10、至此,針對(duì)反爬蟲的措施我們已經(jīng)提前做好了準(zhǔn)備,下一步將進(jìn)行網(wǎng)頁(yè)結(jié)構(gòu)的分析以及網(wǎng)頁(yè)圖片地址數(shù)據(jù)的提取,并針對(duì)解析出來的圖片地址予以批量下載,具體實(shí)現(xiàn)咱們下篇文章進(jìn)行詳解。
/4 小結(jié)/
本文主要內(nèi)容為對(duì)圖片網(wǎng)站進(jìn)行了基本簡(jiǎn)介,基于 Python 中的爬蟲庫(kù) requests 、lxml、fake_useragent,提前部署了請(qǐng)求頭,模擬瀏覽器,針對(duì)反爬蟲的措施我們已經(jīng)提前做好了準(zhǔn)備。
下篇文章將帶大家進(jìn)行網(wǎng)頁(yè)結(jié)構(gòu)的分析以及網(wǎng)頁(yè)圖片地址數(shù)據(jù)的提取,并針對(duì)解析出來的圖片地址予以批量下載,敬請(qǐng)期待~~
往期精彩文章推薦:
想學(xué)習(xí)更多Python網(wǎng)絡(luò)爬蟲與數(shù)據(jù)挖掘知識(shí),可前往專業(yè)網(wǎng)站:http://pdcfighting.com/
代碼演示通過python的requests,BeautifulSoup庫(kù)批量下載360圖片,并保存在本機(jī)的路徑
代碼如下:
#BeautifulSoup庫(kù)是網(wǎng)頁(yè)爬蟲解析庫(kù),主要用來對(duì)HTML源代碼進(jìn)行解析,方便顯示并讀取相應(yīng)的標(biāo)簽數(shù)據(jù) #1、首先導(dǎo)入相應(yīng)的庫(kù) import requests from bs4 import BeautifulSoup import random import os import time #2、對(duì)網(wǎng)站進(jìn)行g(shù)et請(qǐng)求 def gethtml(kward): try: url="https://image.so.com" #設(shè)置360網(wǎng)站的搜索頁(yè)面的前面部分網(wǎng)址 kw={"q":kward} #設(shè)置關(guān)鍵字變量kw headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"} # 設(shè)置網(wǎng)頁(yè)請(qǐng)求頭 response = requests.get(url, params=kw,headers=headers) ##偽裝瀏覽器對(duì)url進(jìn)行g(shù)et請(qǐng)求,傳遞的參數(shù)是kw response.encoding=response.apparent_encoding #根據(jù)網(wǎng)頁(yè)內(nèi)容解析出編碼格式并賦值給response.encoding html=response.text #將網(wǎng)頁(yè)源代碼賦值給html soup=BeautifulSoup(html,'html.parser') #使用html.parser對(duì)html代碼進(jìn)行解析,并賦值給soup變量 print(soup.head) #打印網(wǎng)頁(yè)源代碼的頭部信息 images=soup.find_all('img') #查找源代碼里所有的圖片標(biāo)簽 path="F://明星照片//"+kward+"http://" #設(shè)置圖片的存儲(chǔ)本機(jī)的路徑 for img in images: #遍歷所有的img標(biāo)簽信息 print(img.attrs["src"]) #打印遍歷出來的圖片表情的src屬性值 url1=img.attrs["src"] #設(shè)置url1為遍歷出來的圖片表情的src屬性值 response1=requests.get(url=url1,headers=headers) #上行代碼偽裝瀏覽器對(duì)url1,即圖片網(wǎng)站進(jìn)行g(shù)et請(qǐng)求并將請(qǐng)求結(jié)果賦值給response1 response1.encoding=response1.apparent_encoding #根據(jù)網(wǎng)頁(yè)內(nèi)容解析出編碼格式并賦值給response1.encoding html1=response1.content #將圖片網(wǎng)址的二進(jìn)制源代碼賦值給html1 abspath=path+str(random.random())+".jpg" #設(shè)置存儲(chǔ)路勁為abspath with open(abspath,"wb") as f: #打開文件的絕對(duì)路徑,并對(duì)文件進(jìn)行寫入操作,并設(shè)置為f f.write(html1) #將源代碼寫入f文件 f.close() #關(guān)閉f文件 print(img.attrs["src"]+"下載成功") #打印下載成功的提示 time.sleep(0.2) #設(shè)置時(shí)間休眠0.2秒 except: #如果接受錯(cuò)誤時(shí) print("爬取失敗") #打印爬取失敗
代碼運(yùn)行結(jié)果如下圖所示:
、要求:
①使用Python的tkinter創(chuàng)建一個(gè)下載器
②下載器需要包含圖片類型輸入框和圖片存儲(chǔ)路徑輸入框
③必須要有下載按鈕和清空按鈕,并執(zhí)行相應(yīng)的下載圖片和清空輸入信息的操作
二、代碼如下:
import tkinter
import tkinter as tk
import requests
import time
from lxml import etree
import os
import re
root=tk.Tk()
root.geometry('800x600')
root.title('下載https://www.16pic.com/圖片')
l1=tk.Label(root,text='1、請(qǐng)輸入圖片類型:')
l1.place(x=30,y=10)
v1=tk.StringVar()
e1=tk.Entry(root,textvariable=v1,width=50)
e1.place(x=180,y=10)
l2=tk.Label(root,text='2、請(qǐng)輸入圖片存儲(chǔ)路徑:')
l2.place(x=30,y=30)
v2=tk.StringVar()
e2=tk.Entry(root,textvariable=v2,width=50)
e2.place(x=180,y=30)
e2.insert('end','F:\images')
e3=tk.Text(root,width=200,height=100)
e3.place(x=30,y=100)
global headers
headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.3"}
def download(url,path):
response2=requests.get(url=url,headers=headers)
content=response2.content
i=1
today=time.localtime()
filename=str(today)+str(i)+'.jpg'
with open(os.path.join(path,filename),'wb') as f:
f.write(content)
print("{}下載完成".format(url))
def submit():
kw=e1.get()
url='https://www.16pic.com/sucai/tupian_{}_0-0-0-0-0-0-0-0-0_1.html'.format(kw)
response=requests.get(url=url,headers=headers)
response.encoding='utf-8'
text=response.text
img_list=re.findall(r'<img src="(.*?)"',text)
for image in img_list:
image=image.split('?')
image=image[0]
if '.jpg' in image:
image_result='http:'+image
# print(image_result)
download(image_result, v2.get())
e3.insert('end', image_result+"下載完成")
e3.insert('end','\n')
submit_button=tk.Button(root,text='開始下載',command=submit)
submit_button.place(x=30,y=60)
def clear():
v1.set('')
v2.set('')
e3.delete(1.0,tkinter.END)
clear_button=tk.Button(root,text='清空',command=clear)
clear_button.place(x=200,y=60)
root.mainloop()
三、使用Pyinstaller命令生成可執(zhí)行文件運(yùn)行結(jié)果如下圖所示:
四、代碼運(yùn)行結(jié)果如下圖所示:
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。