爬虫学习笔记(二)——使用 requests 爬取百度图片
一、抓取首頁圖片
靜態(tài)頁面
流程:
1.1、找到目標(biāo)數(shù)據(jù)
這里用狗的圖片來舉例,接下來我們就要分析然后爬取這個(gè)頁面所有狗的圖片的規(guī)律
1.2、分析請(qǐng)求流程
先訪問page頁獲取網(wǎng)頁的源代碼
# 網(wǎng)頁的URL地址 url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1623639077275_R&pv=&ic=0&nc=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E7%8B%97' #添加請(qǐng)求頭 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"} #訪問page頁面 獲取網(wǎng)頁源代碼 res = requests.get(url,headers=headers) print(res.text)可以觀察到網(wǎng)頁源代碼的提取并不完整,因此我們可以按“F12”——NetWork——ALL——Name(排在第一個(gè))查看到請(qǐng)求頭,把所有的請(qǐng)求頭內(nèi)容復(fù)制到代碼里(一般反爬我們有User-Agent就行,不行我們就把所有的請(qǐng)求頭加進(jìn)去)
但是,每個(gè)都要改寫成鍵值對(duì)形式有點(diǎn)麻煩,這里有個(gè)小技巧;
我們可以在pycharm上新建一個(gè)py文件,然后把復(fù)制的請(qǐng)求頭放進(jìn)去,按“Ctrl+R”——勾選“Regex”(這里可以讓我們使用正則方式修改我們需要的內(nèi)容),這樣就能獲取到網(wǎng)頁的源代碼了。
1.3、提取數(shù)據(jù)
我們先找隨機(jī)找一張圖片右擊“復(fù)制圖片地址”,然后在網(wǎng)頁空白部分右擊“查看網(wǎng)頁源代碼”,在網(wǎng)頁源代碼頁面“Ctrl+F”查看它在網(wǎng)頁源代碼里是如何顯示的;
同理我們可以多找?guī)讖垐D片來進(jìn)行比較,通過對(duì)比可得知圖片加載格式有 3 種方式(找到圖片之間的規(guī)律了):"thumbURL":"xxx.jpg"、"middleURL":"xxx.jpg"、"hoverURL":"xxx.jpg",接下來我們就可以通過正則表達(dá)式獲取到圖片的 URL 地址了,最后通過循環(huán)就可以爬取到該頁面的圖片了。
1.4、完整代碼
import requests import re import os# 網(wǎng)頁的URL地址 url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1623639077275_R&pv=&ic=0&nc=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E7%8B%97' #添加請(qǐng)求頭 headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Cache-Control": "max-age=0", "Connection": "keep-alive", "Cookie": "BDIMGISLOGIN=0; winWH=%5E6_1280x578; BDqhfp=%E7%8B%97%26%260-10-1undefined%26%260%26%261; BIDUPSID=88BFCA0DA519F42EA22F89F163D205C5; PSTM=1621005981; BAIDUID=88BFCA0DA519F42EAE9BD14C17C67F24:FG=1; __yjs_duid=1_435ea021e771bf48348cc6d1e442cb191622824721988; H_PS_PSSID=31253_26350; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; delPer=0; PSINO=6; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; BAIDUID_BFESS=88BFCA0DA519F42EAE9BD14C17C67F24:FG=1; firstShowTip=1; cleanHistoryStatus=0; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; BDRCVFR[CLK3Lyfkr9D]=mk3SLVN4HKm; indexPageSugList=%5B%22%E7%8B%97%22%2C%22%E6%A2%A6%E7%90%AA%22%5D; ab_sr=1.0.1_ODM0ZmQ5MDFiNzQ3MzE4NzIyMDg2MWU5NTg5MDgzNmY4OTFhODgwYjUwOWYzZGZiYjZlMTQ4YWNhZjdlMDJiMDM1YmY0NjljZDljMmU5YzM0ZDZhNWYwODIyZWFkZWZkNjcwNjFmM2UxZmU1M2NjOGQxZjc3NGNmNWE5NjA2NWVlMzhiMTlkM2IyNzBlOTgyNDBjMDhjZmEyZDFjM2QyOQ==", "Host": "image.baidu.com", "sec-ch-ua": '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"', "sec-ch-ua-mobile": "?0", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-User": "?1", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" } #訪問page頁面 獲取網(wǎng)頁源代碼 res = requests.get(url,headers=headers) #提取數(shù)據(jù) 狗圖片url urls = re.findall('"thumbURL":"(.*?)"',res.text)# 創(chuàng)建存放的圖片文件夾 if not os.path.exists('images'):os.mkdir('images') #url發(fā)起請(qǐng)求,獲取圖片數(shù)據(jù) for index,img_url in enumerate(urls):# 若圖片的地址中存在\\則替換掉if '\\' in img_url:img_url = img_url.replace("\\","")res = requests.get(img_url) #res 包含 狗圖片數(shù)據(jù)#圖片下載位置、及圖片名稱picname = './images/'+'cat'+ str(index) +'.png'print(picname)with open(picname,'wb') as f:f.write(res.content)結(jié)果:
二、抓取多頁圖片
還是以狗的圖片為例,當(dāng)我們鼠標(biāo)往下滑的時(shí)候,我們會(huì)發(fā)現(xiàn)會(huì)有圖片不斷加載出來,其實(shí)這已經(jīng)是加載到下一頁了。那如果我們不僅想爬第一頁圖片,還想爬第二頁、第三頁呢?
2.1、分析請(qǐng)求流程
構(gòu)造page頁,即找到多個(gè)page頁之間的規(guī)律
首先,按“F12”——點(diǎn)擊“NetWork”——點(diǎn)擊“XHR”,然后隨著鼠標(biāo)滾輪不斷的往下,我們可以看到各個(gè)頁面的網(wǎng)頁源代碼被加載出來。
接下來我們可以復(fù)制幾個(gè)網(wǎng)頁頁面的URL地址進(jìn)行比價(jià)找出它們之間的規(guī)律
https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8353138729825372156&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%8B%97&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E7%8B%97&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn=90&rn=30&gsm=5a&1623720170654= https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8353138729825372156&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%8B%97&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E7%8B%97&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn=120&rn=30&gsm=78&1623720170795=(這里我只列舉了兩個(gè),要比較的話最好多找?guī)讉€(gè))通過比較我們可以看出只有后面部分存在差異,&pn后數(shù)值相差是 30 的倍數(shù),其他的數(shù)值差異不影響結(jié)果(這個(gè)有興趣的可以自己去嘗試),因此我們就可以通過修改 &pn 后的值來獲取多個(gè)網(wǎng)頁
&pn=120&rn=30&gsm=78&1623720170795= #就&pn開始往后存在差異接下來,就是找一個(gè)網(wǎng)頁進(jìn)行圖片分析(這里 分析過程上面已經(jīng)講了)
2.2、完整代碼
import requests import re import osheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}def getimg(urls,filename):"""功能:獲取百度圖片,存儲(chǔ)到文件夾參數(shù):img_urls:圖片url列表filename:圖片存儲(chǔ)文件夾"""for index,img_url in enumerate(urls):if '\\' in img_url:img_url = img_url.replace('\\',"")# url發(fā)起請(qǐng)求,獲取圖片數(shù)據(jù)res = requests.get(img_url, headers=headers)picname = filename+'/'+'dog'+str(index)+'.png'print(picname)with open(picname,'wb') as f:f.write(res.content)for i in range(1,4):url = "https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8443544291319646945&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E7%8B%97&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E7%8B%97&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={0}&rn=30&gsm=1e&1623687251585="index = i*30url = url.format(index)res = requests.get(url,headers=headers)#提取數(shù)據(jù) 狗圖片urlimg_urls = re.findall('"thumbURL":"(.*?)"',res.text)# 創(chuàng)建存放的圖片文件夾filename = 'dog'+str(i)+'.png'if not os.path.exists(filename):os.mkdir(filename)getimg(img_urls,filename)結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的爬虫学习笔记(二)——使用 requests 爬取百度图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 下安装 Redis
- 下一篇: 爬虫学习笔记(三)—— requests