??大家好,我是不溫卜火,是一名計算機學院大資料專業大三的學生,昵稱來源于成語—
不溫不火,本意是希望自己性情溫和,作為一名互聯網行業的小白,博主寫博客一方面是為了記錄自己的學習程序,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處于起步階段的萌新,但由于水平有限,博客中難免會有一些錯誤出現,有紕漏之處懇請各位大佬不吝賜教!暫時只在csdn這一個平臺進行更新,博客主頁:https://buwenbuhuo.blog.csdn.net/,
PS:由于現在越來越多的人未經本人同意直接爬取博主本人文章,博主在此特別宣告:未經本人允許,禁止轉載!!!
目錄
- 一、小小課堂
- 二、保存內容成html
- 2.1 通過selenium模擬普通人查找百度圖片
- 1. 普通人搜索圖片
- 2 分析
- 3 代碼實作
- 4 模擬人為滑鼠滑輪滾動螢屏
- 2.2 此部分完整代碼
- 2.3 保存HTML并查看是否保存成功
- 三、決議圖片鏈接
- 3.1 前期分析
- 3.2 正則提取URL
- 四、完整代碼
- 五、爬取結果
- 六、修改版原始碼(加上代理IP)

一、小小課堂
經過上篇的簡單介紹,相信你們已經對selenium有了初步的了解,那么!為了讓大家對selenium有進一步的了解,細心的博主給大家帶來了福利,那就是使用selenium爬取百度妹子圖,希望大家不要叫我LSP!

至于通過怎樣的思路爬取百度妹子圖呢?博主的大體思路是先獲取一定量的內容保存成html頁面,然后通過決議已經保存的html中的圖片鏈接,然后保存到本地,
二、保存內容成html
2.1 通過selenium模擬普通人查找百度圖片
1. 普通人搜索圖片

已知,正常人打開百度導航搜索圖片的正確方式應該是這樣的:百度導航—>輸入關鍵詞—》點擊查找—》點擊所有圖片

2 分析
🆗知道了普通人如何查找圖片,那么我們下面就通過selenium模擬上述的具體程序,在模擬之前,我們先分析一下幾個主要的點,

- 1. 輸入框
我們通過打開開發者選項,找到輸入框所在部分,決議xpath


- 2. 查詢點擊


- 3. 點擊關于美女的百度圖片


3 代碼實作
# 控制chrome瀏覽器
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
#視窗最大化
driver.maximize_window()
# 輸入網址
driver.get("https://www.baidu.com/")
# 找到文本框,輸入文字
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("哆啦a夢圖片")
#找到按鈕,單擊
driver.find_element_by_xpath('//*[@id="su"]').click()
#停一下,等待加載完畢
time.sleep(2)
#找到a標簽,單擊
driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
#停一下,等待加載完畢
time.sleep(2)

🆗,我們可以看到已經完美的模擬出來程序,

在這里我們看效果是很不錯的,但是其實還是有點小問題的,我們現在其實還只是在第一個視窗中,因此我們需要切換一下的視窗,這個時候我們就需要添加下面一行代碼
#切換視窗,因為現在打開了一個視窗,目前還是在第1個視窗中
driver.switch_to.window(driver.window_handles[1])
4 模擬人為滑鼠滑輪滾動螢屏
模擬人為滑鼠滑輪滾動螢屏,我們有Selenium+python自動化之js螢屏滑動,下列為腳本實作js滑屏
scroll="document.documentElement.scrollTop=800"#垂直滾動 px
scroll = "document.documentElement.scrollLeft=1000"#水平滾動
scroll="window.scrollTo(0,10000)"#滾動到指定坐標
scroll="window.scrollBy(0,100)"#滑動到相對坐標
scroll="window.scrollTo(0,document.body.scrollHeight)"#獲取body的高度,滑到底部
document.body.scrollWidth 獲取body寬度
driver.execute_script(scroll)
在此,博主使用了滑動到指定坐標,由于已經驗證過了,所以直接給出正確游標
window.scrollTo(0,10000)
效果圖如下:

在此,博主先測驗翻頁10次,代碼如下
for i in range(10):
#執行js
driver.execute_script("window.scrollTo(0,10000)")
time.sleep(1)
效果圖:

好了,所有的準備作業,我們已經完成了,那么接下來我們只需把他保存為html頁面即可,
2.2 此部分完整代碼
from selenium import webdriver
from lxml import etree
import os
import time
import requests
import re
import random
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
#創建檔案夾
if not os.path.exists("./files/baidu"):
os.makedirs("./files/baidu")
def get_html():
# 控制chrome瀏覽器
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
#視窗最大化
driver.maximize_window()
# 輸入網址
driver.get("https://www.baidu.com/")
# 找到文本框,輸入文字
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("哆啦a夢圖片")
#找到按鈕,單擊
driver.find_element_by_xpath('//*[@id="su"]').click()
#停一下,等待加載完畢
time.sleep(2)
#找到a標簽,單擊
driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
#停一下,等待加載完畢
time.sleep(2)
#切換視窗,因為現在打開了一個視窗,目前還是在第1個視窗中
driver.switch_to.window(driver.window_handles[1])
for i in range(10):
#執行js
driver.execute_script("window.scrollTo(0,10000)")
time.sleep(1)
#獲取頁面html
html = driver.page_source
# 關閉
driver.quit()
#保存html
with open("baidu.html","w",encoding="utf-8") as file:
file.write(html)
return html
if __name__ == '__main__':
get_html()
2.3 保存HTML并查看是否保存成功


到這里,我們的保存作業就已經完成了,下面就需要對其進行決議了,
三、決議圖片鏈接
3.1 前期分析
在此先給出所以能夠爬取的圖片URL,然后進行分析,如何得到
data-objurl="http://pic.jj20.com/up/allimg/1113/041620103S8/200416103S8-4-1200.jpg"
data-imgurl="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1948216838,2050876637&fm=26&gp=0.jpg">
"hoverURL":"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1948216838,2050876637&fm=26&gp=0.jpg"
"thumbURL":"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1672252528,4061027335&fm=26&gp=0.jpg"
"middleURL":"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1672252528,4061027335&fm=26&gp=0.jpg"
我們首先先把得到的html列印出來,然后通過查找URL,找到圖片的URL即可


由于本次博主只以此兩個URL為例,所以其他的都不在自行查找了,
在提取圖片的URL之前,我們先查看下是不是我們所要的圖片,隨便打開一個
如:https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3026930057,3755157843&fm=26&gp=0.jpg

🆗,正是我們所需要的圖片,下面就可以開始提取了,
3.2 正則提取URL

#讀資料
with open("baidu.html", "r", encoding="utf-8") as file:
html = file.read()
#通過正則獲取img url
img_list1 = re.findall(r'data-objurl="(.*?)"', html)
img_list2 = re.findall(r'data-imgurl="(.*?)"', html)
#合并
img_list1.extend(img_list2)
print(img_list2)

現在我們先打開URL,看看能不能打開,

結果我們發現有的URL并不能打開,這是正常的,因為各種原因總會有某些URL無法打開,這時候我們先多找幾個URL試驗即可,

但是直接這樣看的話,并不好看,這個時候我們需要把他遍歷并列印所有的URL
#替換部分不需要的字符
img_list = map(lambda x:x.replace("amp;",""),img_list1)
#遍歷
for img in img_list:
print(img)
time.sleep(random.random()*3)
然后查看結果

🆗,到這里我們所有需要分析的部分都已經分析完成了,
四、完整代碼

# encoding: utf-8
'''
@author 李華鑫
@create 2020-10-10 9:26
Mycsdn:https://buwenbuhuo.blog.csdn.net/
@contact: 459804692@qq.com
@software: Pycharm
@file: 原始版本.py
@Version:1.0
'''
from selenium import webdriver
from lxml import etree
import os
import time
import requests
import re
import random
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
#創建檔案夾
if not os.path.exists("./files/baidu"):
os.makedirs("./files/baidu")
def get_html():
# 控制chrome瀏覽器
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
#視窗最大化
driver.maximize_window()
# 輸入網址
driver.get("https://www.baidu.com/")
# 找到文本框,輸入文字
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("美女")
#找到按鈕,單擊
driver.find_element_by_xpath('//*[@id="su"]').click()
#停一下,等待加載完畢
time.sleep(2)
#找到a標簽,單擊
driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
#停一下,等待加載完畢
time.sleep(2)
#切換視窗,因為現在打開了一個視窗,目前還是在第1個視窗中
driver.switch_to.window(driver.window_handles[1])
for i in range(10):
#執行js
driver.execute_script("window.scrollTo(0,10000)")
time.sleep(1)
#獲取頁面html
html = driver.page_source
# 關閉
driver.quit()
#保存html
with open("baidu.html","w",encoding="utf-8") as file:
file.write(html)
return html
def get_data():
#讀資料
with open("baidu.html", "r", encoding="utf-8") as file:
html = file.read()
#通過正則獲取img url
img_list1 = re.findall(r'data-objurl="(.*?)"', html)
img_list2 = re.findall(r'data-imgurl="(.*?)"', html)
#合并
img_list1.extend(img_list2)
#替換部分不需要的字符
img_list = map(lambda x:x.replace("amp;",""),img_list1)
#遍歷
for img in img_list:
print(img)
time.sleep(random.random()*3)
#獲取圖片位元組,可能被攔截,加上代理ip
content = requests.get(img,headers=headers).content
#檔案的名字
filename = "./files/baidu/{}".format(img.split("/")[-1])
#檔案寫
with open(filename,"wb") as file:
file.write(content)
if __name__ == '__main__':
get_html()
get_data()
# data-objurl="http://pic.jj20.com/up/allimg/1113/041620103S8/200416103S8-4-1200.jpg"
# data-imgurl="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1948216838,2050876637&fm=26&gp=0.jpg">
# "hoverURL":"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1948216838,2050876637&fm=26&gp=0.jpg"
# "thumbURL":"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1672252528,4061027335&fm=26&gp=0.jpg"
# "middleURL":"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1672252528,4061027335&fm=26&gp=0.jpg"
五、爬取結果


但是! 我們這樣爬取的話,過一段時間就會被識別出來,如下圖:

這個時候,我們最好加上代理IP ,進行回圈爬取,
六、修改版原始碼(加上代理IP)

# encoding: utf-8
'''
@author 李華鑫
@create 2020-10-10 9:27
Mycsdn:https://buwenbuhuo.blog.csdn.net/
@contact: 459804692@qq.com
@software: Pycharm
@file: 添加代理IP.py
@Version:1.0
'''
from selenium import webdriver
from lxml import etree
import os
import time
import requests
import re
import random
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
#創建檔案夾
if not os.path.exists("./files/baidu"):
os.makedirs("./files/baidu")
def get_html():
# 控制chrome瀏覽器
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
#視窗最大化
driver.maximize_window()
# 輸入網址
driver.get("https://www.baidu.com/")
# 找到文本框,輸入文字
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("哆啦A夢圖片")
#找到按鈕,單擊
driver.find_element_by_xpath('//*[@id="su"]').click()
#停一下,等待加載完畢
time.sleep(2)
#找到a標簽,單擊
driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
#停一下,等待加載完畢
time.sleep(2)
#切換視窗,因為現在打開了一個視窗,目前還是在第1個視窗中
driver.switch_to.window(driver.window_handles[1])
for i in range(10):
#執行js
driver.execute_script("window.scrollTo(0,10000)")
time.sleep(1)
#獲取頁面html
html = driver.page_source
# 關閉
driver.quit()
#保存html
with open("baidu.html","w",encoding="utf-8") as file:
file.write(html)
return html
def get_proxies():
#這里獲取的芝麻HTTP代理http https\\
time.sleep(2+random.random()*3)
proxies = {
"http": "",
"https": ""
}
url = "http://http.tiqu.alicdns.com/getip3?num=1&type=2&pro=&city=0&yys=0&port=11&time=1&ts=0&ys=0&cs=1&lb=1&sb=0&pb=45&mr=1®ions="
response = requests.get(url)
content = response.json()
proxies["https"] = content["data"][0]["ip"]+":"+str(content["data"][0]["port"])
return proxies
def get_content(url):
"""發送請求獲取資料"""
#如果報錯,停一會,再發,有10次機會,否則回傳空位元組
for i in range(5):
try:
# 獲取圖片位元組,可能被攔截,加上代理ip
return requests.get(url, headers=headers, proxies=get_proxies()).content
except:
print(url, "失敗,嘗試第{}次".format(i + 1))
time.sleep(random.random()*5)
return b""
def get_data():
#讀資料
with open("baidu.html", "r", encoding="utf-8") as file:
html = file.read()
#通過正則獲取img url
img_list1 = re.findall(r'data-objurl="(.*?)"', html)
img_list2 = re.findall(r'data-imgurl="(.*?)"', html)
#合并
img_list1.extend(img_list2)
#替換部分不需要的字符
img_list = map(lambda x:x.replace("amp;",""),img_list1)
#遍歷
for img in img_list:
print(img)
content = get_content(url=img)
#檔案的名字
filename = "./files/baidu/{}".format(img.split("/")[-1])
#檔案寫
with open(filename,"wb") as file:
file.write(content)
if __name__ == '__main__':
#get_html()
get_data()

美好的日子總是短暫的,雖然還想繼續與大家暢談,但是本篇博文到此已經結束了,如果還嫌不夠過癮,不用擔心,我們下篇見!

??好書不厭讀百回,熟讀課思子自知,而我想要成為全場最靚的仔,就必須堅持通過學習來獲取更多知識,用知識改變命運,用博客見證成長,用行動證明我在努力,
??如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論”“收藏”一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看,
??碼字不易,大家的支持就是我堅持下去的動力,點贊后不要忘了關注我哦!


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198910.html
標籤:其他

