最近中文字幕2019高清,亚洲人成高清在线播放,男生淦哭男生图片动漫有字,国产亚洲精品九九久在线观看,无码av专区丝袜专区

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 62 次瀏覽 ? 2022-02-07 07:14 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞)
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word= % E4%BA%8C%E6%AC%A1%E5%85%83&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=60&rn=30&gsm=1000000001e&81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是已經(jīng)請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word= % E4%BA%8C%E6%AC%A1%E5%85%83&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=60&rn=30&gsm=1000000001e&81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是已經(jīng)請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(一張前端與反爬蟲(chóng)這一的區別)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 274 次瀏覽 ? 2022-02-06 21:23 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(一張前端與反爬蟲(chóng)這一的區別)
  [目錄](méi)
  1. 前言
  對于一個(gè)網(wǎng)頁(yè),我們往往希望它結構合理,內容清晰,以便搜索引擎能夠準確識別。另一方面,還有一些我們不希望內容被輕易獲取的場(chǎng)景,比如電商的交易量網(wǎng)站、教育話(huà)題網(wǎng)站等。因為這些內容往往是產(chǎn)品的命脈,必須得到有效保護。這就是爬行動(dòng)物和反爬行動(dòng)物的話(huà)題的由來(lái)。爬取圖片的整體操作流程可以分為三個(gè)步驟:
  獲取頁(yè)面信息 讀取圖片鏈接并將圖片保存在本地指定目錄
  2. 常見(jiàn)的反爬蟲(chóng)策略
  但是世界上沒(méi)有可以完美反爬蟲(chóng)的網(wǎng)站。
  如果頁(yè)面想要在不給爬蟲(chóng)機會(huì )的情況下正常顯示在用戶(hù)面前,它必須能夠識別真人和機器人。因此,工程師們進(jìn)行了各種嘗試。這些策略大多用在后端,也是目前比較常規有效的手段,比如:
  而爬行動(dòng)物可以無(wú)限接近真人,比如:
  所以我們說(shuō),100% 反爬策略?不存在的。這更像是一種體力活動(dòng),這是一個(gè)困難的問(wèn)題。
  不過(guò)作為前端工程師,我們可以增加游戲的難度,設計一些非常(sang)有意義(bing)思維(kuang)**的反爬蟲(chóng)策略。
  3.前端和反爬蟲(chóng)3.1 FONT-FACE拼湊
  示例:貓眼電影
  在貓眼電影中,票房數據并不是純粹的數字。頁(yè)面使用font-face定義字符集,使用unicode映射顯示。也就是說(shuō),除了圖像識別,還要同時(shí)爬取字符集才能識別數字。
  而且,每次頁(yè)面刷新,字符集的url都會(huì )發(fā)生變化,這無(wú)疑增加了爬取成本,難度更大。
  3.2 背景拼湊
  例子:
  與字體的策略類(lèi)似,美團使用背景拼湊。數字實(shí)際上是圖片,根據不同的背景偏移量顯示不同的字符。
  而不同的頁(yè)面,圖片的字符排序也不同。但是理論上只需要生成0-9和一個(gè)小數點(diǎn),所以不明白為什么會(huì )有重復的字符。
  3.3 個(gè)字符穿插
  示例:微信公眾號文章
  一些微信公眾號的文章中穿插著(zhù)各種神秘的人物,這些人物都是通過(guò)樣式隱藏起來(lái)的。這種方法雖然令人震驚……但其實(shí)識別過(guò)濾也不是太難,甚至可以做得更好,但也是一種腦洞。
  3.4 偽元素隱藏
  示例:汽車(chē)主頁(yè)
  汽車(chē)之家,關(guān)鍵制造商信息被放入偽元素的內容中。這也是一種思路:爬取網(wǎng)頁(yè),必須解析CSS,獲取偽元素的內容,增加了爬蟲(chóng)的難度。
  3.5 元素定位疊加
  示例:去哪里
  數學(xué)愛(ài)好者在哪里?對于一個(gè)4位數的票價(jià),先用四個(gè)i標簽渲染,然后用兩個(gè)b標簽進(jìn)行絕對定位偏移,覆蓋故意顯示錯誤的i標簽,最后在視覺(jué)上形成正確的價(jià)格……
  這說(shuō)明爬蟲(chóng)無(wú)法解析CSS,必須做數學(xué)題。
  3.6 IFRAME 異步加載
  例子:
  打開(kāi)網(wǎng)易云音樂(lè )頁(yè)面時(shí),html源碼中幾乎只有一個(gè)iframe,其src為空:about:blank。然后js開(kāi)始運行,整個(gè)頁(yè)面的frame異步塞進(jìn)iframe中……
  不過(guò)這種方式帶來(lái)的難度并不大,只是在異步和iframe處理上走了彎路(或者還有其他原因,不完全基于反爬的考慮),不管你用selenium還是phantom,都有API可用于 iframe 中的內容信息。
  3.7 個(gè)字符分割
  示例:全網(wǎng)代理IP
  在一些顯示代理IP信息的頁(yè)面上,IP的保護也很麻煩。
  他們會(huì )先將 IP 號和符號劃分為 dom 節點(diǎn),然后在中間插入混淆數字。如果爬蟲(chóng)不知道這個(gè)策略,就會(huì )認為自己成功獲取了值;但如果爬蟲(chóng)注意到,它就會(huì )被解決。.
  3.8 個(gè)字符集替換
  示例:去哪里移動(dòng)邊
  移動(dòng)版去哪兒也會(huì )欺騙爬蟲(chóng)。
  3211明明寫(xiě)在html里,但是1233是直觀(guān)顯示的。原來(lái)他們重新定義了字符集,3和1的順序剛好互換了結果……
  4.示例:爬取百度圖庫
  import re
import os
import time
import requests
# from selenium import webdriver
#########################
###此段代碼不需要關(guān)心啥意思###
#########################
if not os.path.exists('百度圖片'):
os.mkdir('百度圖片')
#####################
###限制30張圖片的代碼###
####################
# 獲取所有圖片
response = requests.get(
'http://image.baidu.com/search/ ... rd%3D風(fēng)景')
data = response.text
img_desc_dics = re.findall("app.setData(\('imgData.*?\));", data, re.S)[0]
img_desc_dics = eval(str(img_desc_dics))
# 獲取所有圖片的數據
img_datas = img_desc_dics[1]['data']
count = 0
for img_data in img_datas:
# 獲取搜索圖片的參數
os_ = img_data.get('os')
cs_ = img_data.get('cs')
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f'http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}'
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall('''\('firstSc'\);" src="(.*?)"''', img_search_data)[0]
img_name = img_url.split('/')[-1]
img_name = os.path.join('百度圖片', img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, 'wb')
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f'{img_name}保存成功,成功保存{count}張')
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
  
  #########################################################################
###自行百度selenium的用法,使用這一套代碼可以無(wú)限爬取所有圖片,否則將被限制30張###
## 記得加庫哦
########################################################################
page_count_end = 2 # 爬取 指定數字(10)* 30 = 300張圖片
chrome = webdriver.Chrome()
## 安裝谷歌插件
##http://chromedriver.storage.go ... iomsg
## 查看你電腦的谷歌版本,尋找對應版本進(jìn)行下載解壓
try:
chrome.implicitly_wait(10)
chrome.get(
'http://image.baidu.com/search/ ... rd%3D風(fēng)景')
js_code = '''
window.scrollTo(0, document.body.scrollHeight);
var lenOfPage = document.body.scrollHeight;
return lenOfPage
'''
# selenium控制爬取頁(yè)數
count = 0
page_count = 0
while page_count < page_count_end:
try:
page_count += 1
chrome.execute_script(js_code)
time.sleep(0.3)
except:
continue
img_desc_search_urls = re.findall(&#39;href="(/search/detail\?.*?)"&#39;, chrome.page_source, re.S) # re.S使.可以匹配換行符
# 獲取所有圖片的數據
for img_data in img_desc_search_urls:
try:
# 獲取搜索圖片的參數
os_ = re.findall(&#39;os=(.*?)&amp;&#39;, img_data)[0]
cs_ = re.findall(&#39;cs=(.*?)&amp;&#39;, img_data)[0]
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f&#39;http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}&#39;
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall(&#39;&#39;&#39;\(&#39;firstSc&#39;\);" src="(.*?)"&#39;&#39;&#39;, img_search_data)[0]
img_name = img_url.split(&#39;/&#39;)[-1]
img_name = os.path.join(&#39;百度圖片&#39;, img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, &#39;wb&#39;)
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f&#39;{img_name}保存成功,成功保存{count}張&#39;)
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
except:
continue
except Exception:
pass
finally:
chrome.close()
  結果
  
  
  由于百度的反爬措施是不斷更新的,如果過(guò)了一段時(shí)間還想爬,就需要尋找新的規則
  5.總結
  對于每個(gè) 網(wǎng)站 爬行,都有一定的規則。每一個(gè)網(wǎng)站,尤其是大的網(wǎng)站,都在定期排版。做爬蟲(chóng),必須注意細節,慎重決策。對于成敗,找到你需要的文字、圖片,或者視頻、文件等,找到它們的鏈接,進(jìn)行多重分析,耐心找出規律,這是你成功的關(guān)鍵。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(一張前端與反爬蟲(chóng)這一的區別)
  [目錄](méi)
  1. 前言
  對于一個(gè)網(wǎng)頁(yè),我們往往希望它結構合理,內容清晰,以便搜索引擎能夠準確識別。另一方面,還有一些我們不希望內容被輕易獲取的場(chǎng)景,比如電商的交易量網(wǎng)站、教育話(huà)題網(wǎng)站等。因為這些內容往往是產(chǎn)品的命脈,必須得到有效保護。這就是爬行動(dòng)物和反爬行動(dòng)物的話(huà)題的由來(lái)。爬取圖片的整體操作流程可以分為三個(gè)步驟:
  獲取頁(yè)面信息 讀取圖片鏈接并將圖片保存在本地指定目錄
  2. 常見(jiàn)的反爬蟲(chóng)策略
  但是世界上沒(méi)有可以完美反爬蟲(chóng)的網(wǎng)站。
  如果頁(yè)面想要在不給爬蟲(chóng)機會(huì )的情況下正常顯示在用戶(hù)面前,它必須能夠識別真人和機器人。因此,工程師們進(jìn)行了各種嘗試。這些策略大多用在后端,也是目前比較常規有效的手段,比如:
  而爬行動(dòng)物可以無(wú)限接近真人,比如:
  所以我們說(shuō),100% 反爬策略?不存在的。這更像是一種體力活動(dòng),這是一個(gè)困難的問(wèn)題。
  不過(guò)作為前端工程師,我們可以增加游戲的難度,設計一些非常(sang)有意義(bing)思維(kuang)**的反爬蟲(chóng)策略。
  3.前端和反爬蟲(chóng)3.1 FONT-FACE拼湊
  示例:貓眼電影
  在貓眼電影中,票房數據并不是純粹的數字。頁(yè)面使用font-face定義字符集,使用unicode映射顯示。也就是說(shuō),除了圖像識別,還要同時(shí)爬取字符集才能識別數字。
  而且,每次頁(yè)面刷新,字符集的url都會(huì )發(fā)生變化,這無(wú)疑增加了爬取成本,難度更大。
  3.2 背景拼湊
  例子:
  與字體的策略類(lèi)似,美團使用背景拼湊。數字實(shí)際上是圖片,根據不同的背景偏移量顯示不同的字符。
  而不同的頁(yè)面,圖片的字符排序也不同。但是理論上只需要生成0-9和一個(gè)小數點(diǎn),所以不明白為什么會(huì )有重復的字符。
  3.3 個(gè)字符穿插
  示例:微信公眾號文章
  一些微信公眾號的文章中穿插著(zhù)各種神秘的人物,這些人物都是通過(guò)樣式隱藏起來(lái)的。這種方法雖然令人震驚……但其實(shí)識別過(guò)濾也不是太難,甚至可以做得更好,但也是一種腦洞。
  3.4 偽元素隱藏
  示例:汽車(chē)主頁(yè)
  汽車(chē)之家,關(guān)鍵制造商信息被放入偽元素的內容中。這也是一種思路:爬取網(wǎng)頁(yè),必須解析CSS,獲取偽元素的內容,增加了爬蟲(chóng)的難度。
  3.5 元素定位疊加
  示例:去哪里
  數學(xué)愛(ài)好者在哪里?對于一個(gè)4位數的票價(jià),先用四個(gè)i標簽渲染,然后用兩個(gè)b標簽進(jìn)行絕對定位偏移,覆蓋故意顯示錯誤的i標簽,最后在視覺(jué)上形成正確的價(jià)格……
  這說(shuō)明爬蟲(chóng)無(wú)法解析CSS,必須做數學(xué)題。
  3.6 IFRAME 異步加載
  例子:
  打開(kāi)網(wǎng)易云音樂(lè )頁(yè)面時(shí),html源碼中幾乎只有一個(gè)iframe,其src為空:about:blank。然后js開(kāi)始運行,整個(gè)頁(yè)面的frame異步塞進(jìn)iframe中……
  不過(guò)這種方式帶來(lái)的難度并不大,只是在異步和iframe處理上走了彎路(或者還有其他原因,不完全基于反爬的考慮),不管你用selenium還是phantom,都有API可用于 iframe 中的內容信息。
  3.7 個(gè)字符分割
  示例:全網(wǎng)代理IP
  在一些顯示代理IP信息的頁(yè)面上,IP的保護也很麻煩。
  他們會(huì )先將 IP 號和符號劃分為 dom 節點(diǎn),然后在中間插入混淆數字。如果爬蟲(chóng)不知道這個(gè)策略,就會(huì )認為自己成功獲取了值;但如果爬蟲(chóng)注意到,它就會(huì )被解決。.
  3.8 個(gè)字符集替換
  示例:去哪里移動(dòng)邊
  移動(dòng)版去哪兒也會(huì )欺騙爬蟲(chóng)。
  3211明明寫(xiě)在html里,但是1233是直觀(guān)顯示的。原來(lái)他們重新定義了字符集,3和1的順序剛好互換了結果……
  4.示例:爬取百度圖庫
  import re
import os
import time
import requests
# from selenium import webdriver
#########################
###此段代碼不需要關(guān)心啥意思###
#########################
if not os.path.exists(&#39;百度圖片&#39;):
os.mkdir(&#39;百度圖片&#39;)
#####################
###限制30張圖片的代碼###
####################
# 獲取所有圖片
response = requests.get(
&#39;http://image.baidu.com/search/ ... rd%3D風(fēng)景&#39;)
data = response.text
img_desc_dics = re.findall("app.setData(\(&#39;imgData.*?\));", data, re.S)[0]
img_desc_dics = eval(str(img_desc_dics))
# 獲取所有圖片的數據
img_datas = img_desc_dics[1][&#39;data&#39;]
count = 0
for img_data in img_datas:
# 獲取搜索圖片的參數
os_ = img_data.get(&#39;os&#39;)
cs_ = img_data.get(&#39;cs&#39;)
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f&#39;http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}&#39;
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall(&#39;&#39;&#39;\(&#39;firstSc&#39;\);" src="(.*?)"&#39;&#39;&#39;, img_search_data)[0]
img_name = img_url.split(&#39;/&#39;)[-1]
img_name = os.path.join(&#39;百度圖片&#39;, img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, &#39;wb&#39;)
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f&#39;{img_name}保存成功,成功保存{count}張&#39;)
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
  
  #########################################################################
###自行百度selenium的用法,使用這一套代碼可以無(wú)限爬取所有圖片,否則將被限制30張###
## 記得加庫哦
########################################################################
page_count_end = 2 # 爬取 指定數字(10)* 30 = 300張圖片
chrome = webdriver.Chrome()
## 安裝谷歌插件
##http://chromedriver.storage.go ... iomsg
## 查看你電腦的谷歌版本,尋找對應版本進(jìn)行下載解壓
try:
chrome.implicitly_wait(10)
chrome.get(
&#39;http://image.baidu.com/search/ ... rd%3D風(fēng)景&#39;)
js_code = &#39;&#39;&#39;
window.scrollTo(0, document.body.scrollHeight);
var lenOfPage = document.body.scrollHeight;
return lenOfPage
&#39;&#39;&#39;
# selenium控制爬取頁(yè)數
count = 0
page_count = 0
while page_count < page_count_end:
try:
page_count += 1
chrome.execute_script(js_code)
time.sleep(0.3)
except:
continue
img_desc_search_urls = re.findall(&#39;href="(/search/detail\?.*?)"&#39;, chrome.page_source, re.S) # re.S使.可以匹配換行符
# 獲取所有圖片的數據
for img_data in img_desc_search_urls:
try:
# 獲取搜索圖片的參數
os_ = re.findall(&#39;os=(.*?)&amp;&#39;, img_data)[0]
cs_ = re.findall(&#39;cs=(.*?)&amp;&#39;, img_data)[0]
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f&#39;http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}&#39;
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall(&#39;&#39;&#39;\(&#39;firstSc&#39;\);" src="(.*?)"&#39;&#39;&#39;, img_search_data)[0]
img_name = img_url.split(&#39;/&#39;)[-1]
img_name = os.path.join(&#39;百度圖片&#39;, img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, &#39;wb&#39;)
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f&#39;{img_name}保存成功,成功保存{count}張&#39;)
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
except:
continue
except Exception:
pass
finally:
chrome.close()
  結果
  
  
  由于百度的反爬措施是不斷更新的,如果過(guò)了一段時(shí)間還想爬,就需要尋找新的規則
  5.總結
  對于每個(gè) 網(wǎng)站 爬行,都有一定的規則。每一個(gè)網(wǎng)站,尤其是大的網(wǎng)站,都在定期排版。做爬蟲(chóng),必須注意細節,慎重決策。對于成敗,找到你需要的文字、圖片,或者視頻、文件等,找到它們的鏈接,進(jìn)行多重分析,耐心找出規律,這是你成功的關(guān)鍵。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何使用加載加載技術(shù)的網(wǎng)頁(yè)數據異步技術(shù)(圖) )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-02-06 21:21 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何使用加載加載技術(shù)的網(wǎng)頁(yè)數據異步技術(shù)(圖)
)
  當你搜索百度圖片(百度圖片)時(shí),你會(huì )發(fā)現,當你向下滑動(dòng)鼠標時(shí),會(huì )自動(dòng)加載下一頁(yè)的圖片數據,但是網(wǎng)頁(yè)的URL并沒(méi)有改變。因此,您無(wú)法通過(guò)通常的構建 URL 的方法來(lái)抓取 Web 數據。這是由于網(wǎng)頁(yè)使用的異步加載技術(shù)。
  異步加載技術(shù)
  傳統網(wǎng)頁(yè)如果需要更新網(wǎng)頁(yè)信息,則需要重新加載整個(gè)網(wǎng)頁(yè)的數據信息。因此,會(huì )出現加載速度慢的情況,導致用戶(hù)體驗不佳。但是,使用異步加載技術(shù)加載網(wǎng)頁(yè)數據,會(huì )通過(guò)后臺與服務(wù)器之間的少量數據交換來(lái)完成數據更新。
  接下來(lái),我們將描述如何使用異步加載技術(shù)來(lái)抓取 Web 數據。以簡(jiǎn)書(shū)網(wǎng)為例()網(wǎng)頁(yè)是《從零開(kāi)始學(xué)Python網(wǎng)絡(luò )爬蟲(chóng)》作者羅攀的主頁(yè)。我們的目的是抓取用戶(hù)文章主題
  
  1、在Chrome瀏覽器中按F12或者右鍵動(dòng)態(tài)-&gt;勾選,繼續向下滾動(dòng)瀏覽其他沒(méi)有變化的動(dòng)態(tài)發(fā)現頁(yè)面的URL。選擇 Network-&gt;XHR-&gt;Response 選項將觀(guān)察到網(wǎng)頁(yè)返回一個(gè) XML 文件。
  
  2、連續向下滑動(dòng)頁(yè)面觀(guān)察Name列的數據,獲取之前頁(yè)面的URL
  3、通過(guò)分析網(wǎng)頁(yè)數據,我們可以得到常規的url,然后爬取數據就容易多了。下面的代碼:
  import requests
import re
#構造URL列表
urls = [&#39;https://www.jianshu.com/u/9104 ... ge%3D{0}/u&#39;.format(str(i)) for i in range(1,20)]
headers = {&#39;user-agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36&#39;}
for url in urls:
res = requests.get(url,headers = headers)
selsctor = re.findall(&#39;(.*?)&#39;,res.content.decode(&#39;utf-8&#39;),re.S)
for i in selsctor:
print(i) 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何使用加載加載技術(shù)的網(wǎng)頁(yè)數據異步技術(shù)(圖)
)
  當你搜索百度圖片(百度圖片)時(shí),你會(huì )發(fā)現,當你向下滑動(dòng)鼠標時(shí),會(huì )自動(dòng)加載下一頁(yè)的圖片數據,但是網(wǎng)頁(yè)的URL并沒(méi)有改變。因此,您無(wú)法通過(guò)通常的構建 URL 的方法來(lái)抓取 Web 數據。這是由于網(wǎng)頁(yè)使用的異步加載技術(shù)。
  異步加載技術(shù)
  傳統網(wǎng)頁(yè)如果需要更新網(wǎng)頁(yè)信息,則需要重新加載整個(gè)網(wǎng)頁(yè)的數據信息。因此,會(huì )出現加載速度慢的情況,導致用戶(hù)體驗不佳。但是,使用異步加載技術(shù)加載網(wǎng)頁(yè)數據,會(huì )通過(guò)后臺與服務(wù)器之間的少量數據交換來(lái)完成數據更新。
  接下來(lái),我們將描述如何使用異步加載技術(shù)來(lái)抓取 Web 數據。以簡(jiǎn)書(shū)網(wǎng)為例()網(wǎng)頁(yè)是《從零開(kāi)始學(xué)Python網(wǎng)絡(luò )爬蟲(chóng)》作者羅攀的主頁(yè)。我們的目的是抓取用戶(hù)文章主題
  
  1、在Chrome瀏覽器中按F12或者右鍵動(dòng)態(tài)-&gt;勾選,繼續向下滾動(dòng)瀏覽其他沒(méi)有變化的動(dòng)態(tài)發(fā)現頁(yè)面的URL。選擇 Network-&gt;XHR-&gt;Response 選項將觀(guān)察到網(wǎng)頁(yè)返回一個(gè) XML 文件。
  
  2、連續向下滑動(dòng)頁(yè)面觀(guān)察Name列的數據,獲取之前頁(yè)面的URL
  3、通過(guò)分析網(wǎng)頁(yè)數據,我們可以得到常規的url,然后爬取數據就容易多了。下面的代碼:
  import requests
import re
#構造URL列表
urls = [&#39;https://www.jianshu.com/u/9104 ... ge%3D{0}/u&#39;.format(str(i)) for i in range(1,20)]
headers = {&#39;user-agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36&#39;}
for url in urls:
res = requests.get(url,headers = headers)
selsctor = re.findall(&#39;(.*?)&#39;,res.content.decode(&#39;utf-8&#39;),re.S)
for i in selsctor:
print(i)

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python的爬蟲(chóng)模塊訓練集圖片數據采集圖片集 )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 129 次瀏覽 ? 2022-02-06 03:00 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python的爬蟲(chóng)模塊訓練集圖片數據采集圖片集
)
  百度圖庫關(guān)鍵詞爬蟲(chóng)腳本本章設計了一個(gè)基于Python的爬蟲(chóng)模塊,可以根據用戶(hù)自定義的關(guān)鍵詞和要爬取的圖片數量,自動(dòng)保存百度圖庫采集中的圖片數據。功能設計與分析
  該模塊為后續模型訓練提供了一個(gè)數據集,屬于data采集部分。該模塊的功能應解決以下問(wèn)題:
  目標網(wǎng)站的圖片數量足夠多,車(chē)輛類(lèi)型涵蓋基本類(lèi)型,爬取難度不要太高。綜合分析,百度圖庫可以滿(mǎn)足上述要求。因此以百度圖庫為目標爬取網(wǎng)站。爬蟲(chóng)模塊應該能夠根據不同的輸入危險車(chē)輛類(lèi)別爬取不同類(lèi)型的車(chē)輛圖片,所以要求爬蟲(chóng)模塊能夠根據不同的車(chē)輛類(lèi)別名稱(chēng)爬取圖片采集圖片爬蟲(chóng)模塊應該是能夠根據用戶(hù)指定的編號爬取采集圖片,然后對Python語(yǔ)言爬蟲(chóng)相關(guān)庫進(jìn)行編號分類(lèi)
  
<p>#/*
#* @Author: hujinlei
#* @Date: 2018-06-07 20:50:31
#* @Last Modified by: hjl
#* @Last Modified time: 2018-06-07 20:50:31
#*/
import os
import re
#import urllib
import json
import socket
import urllib.request
import urllib.parse
import urllib.error
# 設置超時(shí)
import time
timeout = 8
socket.setdefaulttimeout(timeout)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Crawler:
# 睡眠時(shí)長(cháng)
__time_sleep = 0.1
__amount = 0
__start_amount = 0
__counter = 0
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
# 獲取圖片url內容等
# t 下載圖片時(shí)間間隔
def __init__(self, t=0.1):
self.time_sleep = t
# 獲取后綴名
def get_suffix(self, name):
m = re.search(r'\.[^\.]*$', name)
if m.group(0) and len(m.group(0)) 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python的爬蟲(chóng)模塊訓練集圖片數據采集圖片集
)
  百度圖庫關(guān)鍵詞爬蟲(chóng)腳本本章設計了一個(gè)基于Python的爬蟲(chóng)模塊,可以根據用戶(hù)自定義的關(guān)鍵詞和要爬取的圖片數量,自動(dòng)保存百度圖庫采集中的圖片數據。功能設計與分析
  該模塊為后續模型訓練提供了一個(gè)數據集,屬于data采集部分。該模塊的功能應解決以下問(wèn)題:
  目標網(wǎng)站的圖片數量足夠多,車(chē)輛類(lèi)型涵蓋基本類(lèi)型,爬取難度不要太高。綜合分析,百度圖庫可以滿(mǎn)足上述要求。因此以百度圖庫為目標爬取網(wǎng)站。爬蟲(chóng)模塊應該能夠根據不同的輸入危險車(chē)輛類(lèi)別爬取不同類(lèi)型的車(chē)輛圖片,所以要求爬蟲(chóng)模塊能夠根據不同的車(chē)輛類(lèi)別名稱(chēng)爬取圖片采集圖片爬蟲(chóng)模塊應該是能夠根據用戶(hù)指定的編號爬取采集圖片,然后對Python語(yǔ)言爬蟲(chóng)相關(guān)庫進(jìn)行編號分類(lèi)
  
<p>#/*
#* @Author: hujinlei
#* @Date: 2018-06-07 20:50:31
#* @Last Modified by: hjl
#* @Last Modified time: 2018-06-07 20:50:31
#*/
import os
import re
#import urllib
import json
import socket
import urllib.request
import urllib.parse
import urllib.error
# 設置超時(shí)
import time
timeout = 8
socket.setdefaulttimeout(timeout)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Crawler:
# 睡眠時(shí)長(cháng)
__time_sleep = 0.1
__amount = 0
__start_amount = 0
__counter = 0
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
# 獲取圖片url內容等
# t 下載圖片時(shí)間間隔
def __init__(self, t=0.1):
self.time_sleep = t
# 獲取后綴名
def get_suffix(self, name):
m = re.search(r'\.[^\.]*$', name)
if m.group(0) and len(m.group(0))

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)有特別的優(yōu)勢)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 115 次瀏覽 ? 2022-02-06 02:23 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)有特別的優(yōu)勢)
  1.什么是爬蟲(chóng)
  爬蟲(chóng),網(wǎng)絡(luò )爬蟲(chóng),可以理解為在互聯(lián)網(wǎng)上爬行的蜘蛛?;ヂ?lián)網(wǎng)就像一張大網(wǎng),爬蟲(chóng)就是在這張網(wǎng)上四處爬行的蜘蛛。如果遇到資源,就會(huì )被搶。你想搶什么?由你來(lái)控制它。例如,它正在抓取網(wǎng)頁(yè)。在這個(gè)網(wǎng)頁(yè)中,它找到了一條路,這條路實(shí)際上是一個(gè)指向網(wǎng)頁(yè)的超鏈接。然后它可以爬到另一個(gè)網(wǎng)站來(lái)獲取數據。這樣一來(lái),整個(gè)互聯(lián)網(wǎng)絡(luò )對這只蜘蛛來(lái)說(shuō)觸手可及,分分鐘爬下來(lái)也不是問(wèn)題。
  網(wǎng)絡(luò )爬蟲(chóng)是一組可以自動(dòng)從網(wǎng)站的相關(guān)網(wǎng)頁(yè)中搜索和提取數據的程序。提取和存儲這些數據是進(jìn)一步數據分析的關(guān)鍵和前提。Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)具有特殊優(yōu)勢。尤其是業(yè)界有專(zhuān)門(mén)為Python編寫(xiě)的各種爬蟲(chóng)程序框架,使得爬蟲(chóng)程序的編寫(xiě)更加簡(jiǎn)單高效。
  Python 是一種面向對象的解釋型計算機編程語(yǔ)言。它是開(kāi)源的、免費的、功能強大的,并且語(yǔ)法簡(jiǎn)潔明了。它擁有豐富而強大的庫。它是一種廣泛使用的編程語(yǔ)言。
  2.瀏覽網(wǎng)頁(yè)的過(guò)程
  在用戶(hù)瀏覽網(wǎng)頁(yè)的過(guò)程中,我們可能會(huì )看到很多漂亮的圖片,比如我們會(huì )看到幾張圖片和百度搜索框,這個(gè)過(guò)程其實(shí)就是用戶(hù)輸入網(wǎng)址后,經(jīng)過(guò)DNS服務(wù)器,找到服務(wù)器主機, 向服務(wù)器發(fā)送請求,服務(wù)器解析后向用戶(hù)瀏覽器發(fā)送HTML、JS、CSS等文件。瀏覽器解析后,用戶(hù)可以看到各種圖片。
  因此,用戶(hù)看到的網(wǎng)頁(yè)本質(zhì)上是由 HTML 代碼組成的,爬蟲(chóng)爬取這些內容。通過(guò)對這些HTML代碼進(jìn)行分析和過(guò)濾,實(shí)現圖片、文字等資源的獲取。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)有特別的優(yōu)勢)
  1.什么是爬蟲(chóng)
  爬蟲(chóng),網(wǎng)絡(luò )爬蟲(chóng),可以理解為在互聯(lián)網(wǎng)上爬行的蜘蛛?;ヂ?lián)網(wǎng)就像一張大網(wǎng),爬蟲(chóng)就是在這張網(wǎng)上四處爬行的蜘蛛。如果遇到資源,就會(huì )被搶。你想搶什么?由你來(lái)控制它。例如,它正在抓取網(wǎng)頁(yè)。在這個(gè)網(wǎng)頁(yè)中,它找到了一條路,這條路實(shí)際上是一個(gè)指向網(wǎng)頁(yè)的超鏈接。然后它可以爬到另一個(gè)網(wǎng)站來(lái)獲取數據。這樣一來(lái),整個(gè)互聯(lián)網(wǎng)絡(luò )對這只蜘蛛來(lái)說(shuō)觸手可及,分分鐘爬下來(lái)也不是問(wèn)題。
  網(wǎng)絡(luò )爬蟲(chóng)是一組可以自動(dòng)從網(wǎng)站的相關(guān)網(wǎng)頁(yè)中搜索和提取數據的程序。提取和存儲這些數據是進(jìn)一步數據分析的關(guān)鍵和前提。Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)具有特殊優(yōu)勢。尤其是業(yè)界有專(zhuān)門(mén)為Python編寫(xiě)的各種爬蟲(chóng)程序框架,使得爬蟲(chóng)程序的編寫(xiě)更加簡(jiǎn)單高效。
  Python 是一種面向對象的解釋型計算機編程語(yǔ)言。它是開(kāi)源的、免費的、功能強大的,并且語(yǔ)法簡(jiǎn)潔明了。它擁有豐富而強大的庫。它是一種廣泛使用的編程語(yǔ)言。
  2.瀏覽網(wǎng)頁(yè)的過(guò)程
  在用戶(hù)瀏覽網(wǎng)頁(yè)的過(guò)程中,我們可能會(huì )看到很多漂亮的圖片,比如我們會(huì )看到幾張圖片和百度搜索框,這個(gè)過(guò)程其實(shí)就是用戶(hù)輸入網(wǎng)址后,經(jīng)過(guò)DNS服務(wù)器,找到服務(wù)器主機, 向服務(wù)器發(fā)送請求,服務(wù)器解析后向用戶(hù)瀏覽器發(fā)送HTML、JS、CSS等文件。瀏覽器解析后,用戶(hù)可以看到各種圖片。
  因此,用戶(hù)看到的網(wǎng)頁(yè)本質(zhì)上是由 HTML 代碼組成的,爬蟲(chóng)爬取這些內容。通過(guò)對這些HTML代碼進(jìn)行分析和過(guò)濾,實(shí)現圖片、文字等資源的獲取。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(本文側重于的系統設計和實(shí)現的部分細節,內容來(lái)源于兩方面)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-02-06 01:09 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(本文側重于的系統設計和實(shí)現的部分細節,內容來(lái)源于兩方面)
  網(wǎng)絡(luò )爬蟲(chóng)經(jīng)常被忽視,尤其是與搜索引擎的光環(huán)相比,這似乎有點(diǎn)黯淡。我很少看到 文章 或詳細說(shuō)明爬蟲(chóng)實(shí)現的文檔。但是,爬蟲(chóng)其實(shí)是一個(gè)非常重要的系統,尤其是在當今數據為王的時(shí)代。如果你是一個(gè)沒(méi)有任何原創(chuàng )數據積累的初創(chuàng )公司或項目,那么使用爬蟲(chóng)在互聯(lián)網(wǎng)上找到那些有價(jià)值的數據,然后對數據進(jìn)行清洗和整理是快速獲取數據的重要手段。
  本文重點(diǎn)介紹爬蟲(chóng)的系統設計和實(shí)現的一些細節。內容來(lái)自?xún)蓚€(gè)方面。一個(gè)是我做了一個(gè)多月的爬蟲(chóng)經(jīng)驗,但是我做的爬蟲(chóng)規模不是太大,性能要求不能滿(mǎn)足。百度這么高的要求,二是從閱讀幾個(gè)文檔中衍生出來(lái)的。我找到的關(guān)于爬蟲(chóng)系統的文獻大多是2000年左右,之后就很少了,說(shuō)明10年前爬蟲(chóng)的系統設計基本解決了(不是百度剛開(kāi)始的2000年,說(shuō)可能是它的爬蟲(chóng))也指這些文章^-^)。
  另外,由于本文關(guān)注的是系統問(wèn)題,所以有些內容就不再贅述了,比如那些隱藏的web數據如何爬取,ajax頁(yè)面如何爬取,如何動(dòng)態(tài)調整爬取頻率等等。
  文本
  一個(gè)正式的、完整的網(wǎng)絡(luò )爬蟲(chóng)其實(shí)是一個(gè)非常復雜的系統:首先,它是一個(gè)海量數據處理系統,因為它要面對的是整個(gè)互聯(lián)網(wǎng)網(wǎng)頁(yè),即使是一個(gè)小的、垂直的爬蟲(chóng),一般它也需要抓取數十億或數百億的網(wǎng)頁(yè);其次,它也是一個(gè)性能要求不錯的系統,可能需要同時(shí)下載上千個(gè)網(wǎng)頁(yè),快速提取網(wǎng)頁(yè)中的url,處理海量的url。重復數據刪除等;歸根結底,它真的不是一個(gè)面向最終用戶(hù)的系統,所以雖然也非常需要穩定性,但偶爾的宕機也不是什么災難,也不存在流量激增的情況同時(shí),如果性能在短時(shí)間內下降,這不是問(wèn)題。從這個(gè)角度來(lái)看,
  
  上圖是一個(gè)爬蟲(chóng)系統框架,基本收錄了一個(gè)爬蟲(chóng)系統所需的所有模塊。
  在任何爬蟲(chóng)系統的設計圖中,你都會(huì )發(fā)現有一個(gè)循環(huán),代表了爬蟲(chóng)的一般工作流程:根據URL下載對應的網(wǎng)頁(yè),然后提取網(wǎng)頁(yè)中收錄的URL,然后根據到這些新的 URL 下載相應的網(wǎng)頁(yè),然后一遍又一遍地重新開(kāi)始。爬蟲(chóng)系統的子模塊都位于這個(gè)循環(huán)中,完成一個(gè)特定的功能。
  這些子模塊通常包括:
  fetcher:用于根據url下載對應的網(wǎng)頁(yè);
  DNS解析器:DNS解析;
  看到的內容:網(wǎng)絡(luò )內容的重復數據刪除;
  Extractor:提取網(wǎng)頁(yè)中的url或者其他一些內容;
  URL過(guò)濾器:過(guò)濾掉不需要下載的URL;
  URL Seen:對 url 進(jìn)行重復數據刪除;
  URL Set:存儲所有的url;
  URL Frontier:類(lèi)似于調度器,決定接下來(lái)下載哪些URL對應哪些網(wǎng)頁(yè);
  提取器和 DNS 解析器
  這兩個(gè)模塊是兩個(gè)非常簡(jiǎn)單的獨立服務(wù):DNS Resolver負責域名解析;fetcher的輸入是域名解析后的url,返回的是url對應的網(wǎng)頁(yè)內容。對于任何網(wǎng)頁(yè)抓取,都需要調用這兩個(gè)模塊。
  對于一般的爬蟲(chóng)來(lái)說(shuō),這兩個(gè)模塊可以做得很簡(jiǎn)單,甚至可以合并在一起。但是對于具有高性能要求的系統,它們可能成為潛在的性能瓶頸。主要原因是域名解析和爬取都是耗時(shí)的任務(wù)。比如抓取網(wǎng)頁(yè)時(shí),一般延遲在幾百毫秒。如果遇到慢網(wǎng)站,可能需要幾秒甚至十幾秒,會(huì )導致工作線(xiàn)程阻塞等待很長(cháng)時(shí)間。如果希望 Fetcher 能夠每秒下載數千頁(yè)或更多頁(yè)面,則需要啟動(dòng)大量工作線(xiàn)程。
  因此,對于性能要求較高的爬蟲(chóng)系統,一般采用epoll或類(lèi)似的技術(shù),將兩個(gè)模塊改成異步機制。另外,DNS解析的結果也被緩存,大大減少了DNS解析的操作。
  看到的內容
  互聯(lián)網(wǎng)上有些網(wǎng)站經(jīng)常有鏡像網(wǎng)站(鏡像),即兩個(gè)網(wǎng)站的內容相同但網(wǎng)頁(yè)對應的域名不同。這將導致多次重復爬取同一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。為了避免這種情況,對于每一個(gè)爬取的網(wǎng)頁(yè),首先需要進(jìn)入 Content Seen 模塊。模塊會(huì )判斷網(wǎng)頁(yè)內容與下載的網(wǎng)頁(yè)內容是否一致。如果它們一致,則不會(huì )發(fā)送網(wǎng)頁(yè)進(jìn)行進(jìn)一步處理。這種方法可以顯著(zhù)減少爬蟲(chóng)需要下載的網(wǎng)頁(yè)數量。
  至于判斷兩個(gè)網(wǎng)頁(yè)的內容是否一致,大致思路是這樣的:不是直接比較兩個(gè)網(wǎng)頁(yè)的內容,而是計算網(wǎng)頁(yè)的內容,生成一個(gè)FingerPrint(指紋),通常是一個(gè)指紋是固定長(cháng)度。該字符串比網(wǎng)頁(yè)的正文短得多。如果兩個(gè)網(wǎng)頁(yè)的指紋相同,則認為它們的內容相同。
  提取器和 URL 過(guò)濾器
  提取器的工作是從下載的網(wǎng)頁(yè)中提取它收錄的所有 URL。這是一項精細的工作,需要考慮所有可能的 url 樣式,例如網(wǎng)頁(yè)中往往收錄相對路徑 url,在提取時(shí)需要將其轉換為絕對路徑。
  Url Filter 是對提取的 url 進(jìn)行再次過(guò)濾。不同的應用有不同的篩選標準。比如baidu/google搜索一般不會(huì )被屏蔽,但是對于垂直搜索或者定向爬取的應用,可能只需要滿(mǎn)足一定條件的url,比如不需要圖片的url,比如只需要一個(gè)圖片的url需要具體的網(wǎng)站等。Url Filter是一個(gè)與應用密切相關(guān)的模塊。
  看到的網(wǎng)址
  Url Seen 用于對 url 進(jìn)行重復數據刪除。之前寫(xiě)過(guò)一篇關(guān)于url去重的博客,這里不再贅述。
  對于一個(gè)大型爬蟲(chóng)系統來(lái)說(shuō),它可能已經(jīng)有 100 億或 1000 億個(gè) URL。如何快速判斷是否出現了新的 URL 非常重要。因為大型爬蟲(chóng)系統可能在一秒鐘內下載數千個(gè)網(wǎng)頁(yè),一個(gè)網(wǎng)頁(yè)一般可以提取幾十個(gè)url,每個(gè)url都需要進(jìn)行去重操作??梢韵胂?,每秒需要執行大量的去重操作。. 因此 Url Seen 是整個(gè)爬蟲(chóng)系統中技術(shù)含量很高的部分。(Content Seen其實(shí)有這個(gè)問(wèn)題)
  網(wǎng)址集
  url經(jīng)過(guò)前面的一系列處理后,會(huì )被放入到Url Set中進(jìn)行調度獲取。由于 url 數量眾多,可能只有一小部分會(huì )放在內存中,而大部分會(huì )寫(xiě)入磁盤(pán)。通常,Url Set 的實(shí)現是一些文件或數據庫。
  網(wǎng)址邊界
  Frontier(不知道為什么叫這個(gè)名字)放在最后是因為它可以說(shuō)是整個(gè)爬蟲(chóng)系統的引擎和驅動(dòng),組織和調用其他模塊。
  當爬蟲(chóng)啟動(dòng)時(shí),Frontier 內部會(huì )有一些種子 url。它首先將種子url發(fā)送給Fetcher進(jìn)行抓取,然后將抓取的網(wǎng)頁(yè)發(fā)送給Extractor提取新的url,然后將新的url重放進(jìn)入Url Set;而當 Frontier 里面的 url 已經(jīng)被爬取完畢時(shí),它會(huì )從 Url Set 中提取那些沒(méi)有被爬取的新 url,如此循環(huán)往復。
  Frontier的調度實(shí)現有很多,這里只介紹最常用的實(shí)現方式。在此之前,需要稍微解釋一下。雖然我們在介紹 Fetcher 的時(shí)候說(shuō)過(guò),一個(gè)好的 Fetcher 每秒可以下載幾十萬(wàn)個(gè)網(wǎng)頁(yè),但是對于特定的目標 網(wǎng)站,比如爬蟲(chóng)系統會(huì )爬得很慢,而且只會(huì )每十秒被抓一次。這是為了確保目標 網(wǎng)站 不會(huì )被爬蟲(chóng)捕獲。
  為了做到這一點(diǎn),Frontier 內部對每個(gè)域名都有一個(gè)對應的 FIFO 隊列,該隊列存儲了域名下的 url。Frontier 每次都會(huì )從某個(gè)隊列中拉出一個(gè) url 進(jìn)行爬取。隊列將保存 Frontier 上次調用它的時(shí)間。如果時(shí)間距離已經(jīng)超過(guò)某個(gè)值,則可以再次調用隊列。
  Frontier 可能同時(shí)有上千個(gè)這樣的隊列,它會(huì )輪詢(xún)得到一個(gè)可以調用的隊列,然后從隊列中拉出一個(gè) url 去獲取。一旦隊列中的所有url都被消費到一定程度,Frontier就會(huì )從Url Set中抽取一批新的url,放入對應的隊列中。
  分散式
  當單機版爬蟲(chóng)性能不能滿(mǎn)足要求時(shí),應考慮使用多臺機器組成分布式爬蟲(chóng)系統。分布式爬蟲(chóng)架構其實(shí)比想象的要簡(jiǎn)單得多。一個(gè)簡(jiǎn)單的做法是:假設有N臺機器,每臺機器都有一個(gè)完整的爬蟲(chóng)系統在運行,每臺機器的爬蟲(chóng)都在從Extractor模塊中獲取新的信息。在url之后,根據url的域名進(jìn)行hash,然后取模N得到結果n,然后將url放入第n臺機器的Url Set中。這樣,不同的網(wǎng)站 URL就會(huì )在不同的機器上處理。
  以上是完整爬蟲(chóng)的系統實(shí)現。當然,由于篇幅限制,有些細節被省略了。例如,在爬取每個(gè)網(wǎng)站之前,爬蟲(chóng)需要讀取網(wǎng)站的robots.txt來(lái)判斷網(wǎng)站是否允許被爬?。ň〇|把robots. txt 前一段時(shí)間在 robots.txt 中)。一淘的爬蟲(chóng)被堵住了。需要注意的是robots.txt只是行業(yè)協(xié)議,在技術(shù)上不能強行拒絕爬蟲(chóng)的爬?。?;再例如,一些網(wǎng)站 提供站點(diǎn)地圖,它可以直接從站點(diǎn)地圖中獲取該網(wǎng)站 的所有url;等等。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(本文側重于的系統設計和實(shí)現的部分細節,內容來(lái)源于兩方面)
  網(wǎng)絡(luò )爬蟲(chóng)經(jīng)常被忽視,尤其是與搜索引擎的光環(huán)相比,這似乎有點(diǎn)黯淡。我很少看到 文章 或詳細說(shuō)明爬蟲(chóng)實(shí)現的文檔。但是,爬蟲(chóng)其實(shí)是一個(gè)非常重要的系統,尤其是在當今數據為王的時(shí)代。如果你是一個(gè)沒(méi)有任何原創(chuàng )數據積累的初創(chuàng )公司或項目,那么使用爬蟲(chóng)在互聯(lián)網(wǎng)上找到那些有價(jià)值的數據,然后對數據進(jìn)行清洗和整理是快速獲取數據的重要手段。
  本文重點(diǎn)介紹爬蟲(chóng)的系統設計和實(shí)現的一些細節。內容來(lái)自?xún)蓚€(gè)方面。一個(gè)是我做了一個(gè)多月的爬蟲(chóng)經(jīng)驗,但是我做的爬蟲(chóng)規模不是太大,性能要求不能滿(mǎn)足。百度這么高的要求,二是從閱讀幾個(gè)文檔中衍生出來(lái)的。我找到的關(guān)于爬蟲(chóng)系統的文獻大多是2000年左右,之后就很少了,說(shuō)明10年前爬蟲(chóng)的系統設計基本解決了(不是百度剛開(kāi)始的2000年,說(shuō)可能是它的爬蟲(chóng))也指這些文章^-^)。
  另外,由于本文關(guān)注的是系統問(wèn)題,所以有些內容就不再贅述了,比如那些隱藏的web數據如何爬取,ajax頁(yè)面如何爬取,如何動(dòng)態(tài)調整爬取頻率等等。
  文本
  一個(gè)正式的、完整的網(wǎng)絡(luò )爬蟲(chóng)其實(shí)是一個(gè)非常復雜的系統:首先,它是一個(gè)海量數據處理系統,因為它要面對的是整個(gè)互聯(lián)網(wǎng)網(wǎng)頁(yè),即使是一個(gè)小的、垂直的爬蟲(chóng),一般它也需要抓取數十億或數百億的網(wǎng)頁(yè);其次,它也是一個(gè)性能要求不錯的系統,可能需要同時(shí)下載上千個(gè)網(wǎng)頁(yè),快速提取網(wǎng)頁(yè)中的url,處理海量的url。重復數據刪除等;歸根結底,它真的不是一個(gè)面向最終用戶(hù)的系統,所以雖然也非常需要穩定性,但偶爾的宕機也不是什么災難,也不存在流量激增的情況同時(shí),如果性能在短時(shí)間內下降,這不是問(wèn)題。從這個(gè)角度來(lái)看,
  
  上圖是一個(gè)爬蟲(chóng)系統框架,基本收錄了一個(gè)爬蟲(chóng)系統所需的所有模塊。
  在任何爬蟲(chóng)系統的設計圖中,你都會(huì )發(fā)現有一個(gè)循環(huán),代表了爬蟲(chóng)的一般工作流程:根據URL下載對應的網(wǎng)頁(yè),然后提取網(wǎng)頁(yè)中收錄的URL,然后根據到這些新的 URL 下載相應的網(wǎng)頁(yè),然后一遍又一遍地重新開(kāi)始。爬蟲(chóng)系統的子模塊都位于這個(gè)循環(huán)中,完成一個(gè)特定的功能。
  這些子模塊通常包括:
  fetcher:用于根據url下載對應的網(wǎng)頁(yè);
  DNS解析器:DNS解析;
  看到的內容:網(wǎng)絡(luò )內容的重復數據刪除;
  Extractor:提取網(wǎng)頁(yè)中的url或者其他一些內容;
  URL過(guò)濾器:過(guò)濾掉不需要下載的URL;
  URL Seen:對 url 進(jìn)行重復數據刪除;
  URL Set:存儲所有的url;
  URL Frontier:類(lèi)似于調度器,決定接下來(lái)下載哪些URL對應哪些網(wǎng)頁(yè);
  提取器和 DNS 解析器
  這兩個(gè)模塊是兩個(gè)非常簡(jiǎn)單的獨立服務(wù):DNS Resolver負責域名解析;fetcher的輸入是域名解析后的url,返回的是url對應的網(wǎng)頁(yè)內容。對于任何網(wǎng)頁(yè)抓取,都需要調用這兩個(gè)模塊。
  對于一般的爬蟲(chóng)來(lái)說(shuō),這兩個(gè)模塊可以做得很簡(jiǎn)單,甚至可以合并在一起。但是對于具有高性能要求的系統,它們可能成為潛在的性能瓶頸。主要原因是域名解析和爬取都是耗時(shí)的任務(wù)。比如抓取網(wǎng)頁(yè)時(shí),一般延遲在幾百毫秒。如果遇到慢網(wǎng)站,可能需要幾秒甚至十幾秒,會(huì )導致工作線(xiàn)程阻塞等待很長(cháng)時(shí)間。如果希望 Fetcher 能夠每秒下載數千頁(yè)或更多頁(yè)面,則需要啟動(dòng)大量工作線(xiàn)程。
  因此,對于性能要求較高的爬蟲(chóng)系統,一般采用epoll或類(lèi)似的技術(shù),將兩個(gè)模塊改成異步機制。另外,DNS解析的結果也被緩存,大大減少了DNS解析的操作。
  看到的內容
  互聯(lián)網(wǎng)上有些網(wǎng)站經(jīng)常有鏡像網(wǎng)站(鏡像),即兩個(gè)網(wǎng)站的內容相同但網(wǎng)頁(yè)對應的域名不同。這將導致多次重復爬取同一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。為了避免這種情況,對于每一個(gè)爬取的網(wǎng)頁(yè),首先需要進(jìn)入 Content Seen 模塊。模塊會(huì )判斷網(wǎng)頁(yè)內容與下載的網(wǎng)頁(yè)內容是否一致。如果它們一致,則不會(huì )發(fā)送網(wǎng)頁(yè)進(jìn)行進(jìn)一步處理。這種方法可以顯著(zhù)減少爬蟲(chóng)需要下載的網(wǎng)頁(yè)數量。
  至于判斷兩個(gè)網(wǎng)頁(yè)的內容是否一致,大致思路是這樣的:不是直接比較兩個(gè)網(wǎng)頁(yè)的內容,而是計算網(wǎng)頁(yè)的內容,生成一個(gè)FingerPrint(指紋),通常是一個(gè)指紋是固定長(cháng)度。該字符串比網(wǎng)頁(yè)的正文短得多。如果兩個(gè)網(wǎng)頁(yè)的指紋相同,則認為它們的內容相同。
  提取器和 URL 過(guò)濾器
  提取器的工作是從下載的網(wǎng)頁(yè)中提取它收錄的所有 URL。這是一項精細的工作,需要考慮所有可能的 url 樣式,例如網(wǎng)頁(yè)中往往收錄相對路徑 url,在提取時(shí)需要將其轉換為絕對路徑。
  Url Filter 是對提取的 url 進(jìn)行再次過(guò)濾。不同的應用有不同的篩選標準。比如baidu/google搜索一般不會(huì )被屏蔽,但是對于垂直搜索或者定向爬取的應用,可能只需要滿(mǎn)足一定條件的url,比如不需要圖片的url,比如只需要一個(gè)圖片的url需要具體的網(wǎng)站等。Url Filter是一個(gè)與應用密切相關(guān)的模塊。
  看到的網(wǎng)址
  Url Seen 用于對 url 進(jìn)行重復數據刪除。之前寫(xiě)過(guò)一篇關(guān)于url去重的博客,這里不再贅述。
  對于一個(gè)大型爬蟲(chóng)系統來(lái)說(shuō),它可能已經(jīng)有 100 億或 1000 億個(gè) URL。如何快速判斷是否出現了新的 URL 非常重要。因為大型爬蟲(chóng)系統可能在一秒鐘內下載數千個(gè)網(wǎng)頁(yè),一個(gè)網(wǎng)頁(yè)一般可以提取幾十個(gè)url,每個(gè)url都需要進(jìn)行去重操作??梢韵胂?,每秒需要執行大量的去重操作。. 因此 Url Seen 是整個(gè)爬蟲(chóng)系統中技術(shù)含量很高的部分。(Content Seen其實(shí)有這個(gè)問(wèn)題)
  網(wǎng)址集
  url經(jīng)過(guò)前面的一系列處理后,會(huì )被放入到Url Set中進(jìn)行調度獲取。由于 url 數量眾多,可能只有一小部分會(huì )放在內存中,而大部分會(huì )寫(xiě)入磁盤(pán)。通常,Url Set 的實(shí)現是一些文件或數據庫。
  網(wǎng)址邊界
  Frontier(不知道為什么叫這個(gè)名字)放在最后是因為它可以說(shuō)是整個(gè)爬蟲(chóng)系統的引擎和驅動(dòng),組織和調用其他模塊。
  當爬蟲(chóng)啟動(dòng)時(shí),Frontier 內部會(huì )有一些種子 url。它首先將種子url發(fā)送給Fetcher進(jìn)行抓取,然后將抓取的網(wǎng)頁(yè)發(fā)送給Extractor提取新的url,然后將新的url重放進(jìn)入Url Set;而當 Frontier 里面的 url 已經(jīng)被爬取完畢時(shí),它會(huì )從 Url Set 中提取那些沒(méi)有被爬取的新 url,如此循環(huán)往復。
  Frontier的調度實(shí)現有很多,這里只介紹最常用的實(shí)現方式。在此之前,需要稍微解釋一下。雖然我們在介紹 Fetcher 的時(shí)候說(shuō)過(guò),一個(gè)好的 Fetcher 每秒可以下載幾十萬(wàn)個(gè)網(wǎng)頁(yè),但是對于特定的目標 網(wǎng)站,比如爬蟲(chóng)系統會(huì )爬得很慢,而且只會(huì )每十秒被抓一次。這是為了確保目標 網(wǎng)站 不會(huì )被爬蟲(chóng)捕獲。
  為了做到這一點(diǎn),Frontier 內部對每個(gè)域名都有一個(gè)對應的 FIFO 隊列,該隊列存儲了域名下的 url。Frontier 每次都會(huì )從某個(gè)隊列中拉出一個(gè) url 進(jìn)行爬取。隊列將保存 Frontier 上次調用它的時(shí)間。如果時(shí)間距離已經(jīng)超過(guò)某個(gè)值,則可以再次調用隊列。
  Frontier 可能同時(shí)有上千個(gè)這樣的隊列,它會(huì )輪詢(xún)得到一個(gè)可以調用的隊列,然后從隊列中拉出一個(gè) url 去獲取。一旦隊列中的所有url都被消費到一定程度,Frontier就會(huì )從Url Set中抽取一批新的url,放入對應的隊列中。
  分散式
  當單機版爬蟲(chóng)性能不能滿(mǎn)足要求時(shí),應考慮使用多臺機器組成分布式爬蟲(chóng)系統。分布式爬蟲(chóng)架構其實(shí)比想象的要簡(jiǎn)單得多。一個(gè)簡(jiǎn)單的做法是:假設有N臺機器,每臺機器都有一個(gè)完整的爬蟲(chóng)系統在運行,每臺機器的爬蟲(chóng)都在從Extractor模塊中獲取新的信息。在url之后,根據url的域名進(jìn)行hash,然后取模N得到結果n,然后將url放入第n臺機器的Url Set中。這樣,不同的網(wǎng)站 URL就會(huì )在不同的機器上處理。
  以上是完整爬蟲(chóng)的系統實(shí)現。當然,由于篇幅限制,有些細節被省略了。例如,在爬取每個(gè)網(wǎng)站之前,爬蟲(chóng)需要讀取網(wǎng)站的robots.txt來(lái)判斷網(wǎng)站是否允許被爬?。ň〇|把robots. txt 前一段時(shí)間在 robots.txt 中)。一淘的爬蟲(chóng)被堵住了。需要注意的是robots.txt只是行業(yè)協(xié)議,在技術(shù)上不能強行拒絕爬蟲(chóng)的爬?。?;再例如,一些網(wǎng)站 提供站點(diǎn)地圖,它可以直接從站點(diǎn)地圖中獲取該網(wǎng)站 的所有url;等等。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度百科的歷史記錄,結果在時(shí)隔四個(gè)月之后再次遇到的對手)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 74 次瀏覽 ? 2022-02-06 01:03 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度百科的歷史記錄,結果在時(shí)隔四個(gè)月之后再次遇到的對手)
  動(dòng)態(tài)頁(yè)面爬取
  很久沒(méi)有寫(xiě)爬蟲(chóng)了。今天敲了一個(gè)爬蟲(chóng)——爬百度百科的歷史記錄。結果時(shí)隔四個(gè)月再次遇到的對手居然是動(dòng)態(tài)頁(yè)面(我一開(kāi)始覺(jué)得百度太簡(jiǎn)單了。),但經(jīng)過(guò)一番努力,還是達到了自己的目標,然后就寫(xiě)了博客作為評論。
  一、概念
  動(dòng)態(tài)頁(yè)面實(shí)際上是相對于靜態(tài)頁(yè)面的。面對靜態(tài)頁(yè)面時(shí),直接查看響應一般是網(wǎng)頁(yè)的整個(gè)代碼,而對于動(dòng)態(tài)頁(yè)面則不然。一般來(lái)說(shuō),當再次打開(kāi)動(dòng)態(tài)頁(yè)面的響應時(shí),會(huì )與您在網(wǎng)頁(yè)上看到的有所不同。
  二、練習和練習前
  因為我很喜歡練習,所以我會(huì )一言不發(fā)地練習,練習會(huì )給你真正的知識,你多練習就會(huì )明白。
  目標頁(yè)面:萬(wàn)科百度百科歷史版
  實(shí)現環(huán)境:win32
  版本:python 3.6.2
  實(shí)用目標:獲取萬(wàn)科百度百科歷史版的歷史修改時(shí)間,制作圖表或csv文件
  三、流程說(shuō)明
  和所有爬蟲(chóng)一樣,我們的第一步會(huì )是分析網(wǎng)頁(yè),因為我們的目標選擇的是動(dòng)態(tài)網(wǎng)頁(yè),所以我們還需要跟蹤json文件等等。
  過(guò)程:
  1、網(wǎng)頁(yè)分析
  2、查詢(xún)、跟蹤json等文件或xhr
  3、 用于文本匹配
  4、繪制或制作 csv
  四、工具準備
  我們需要的庫是(所有最新版本):
  1.請求
  2.回復
 ?。ㄒ韵聨鞂τ谂老x(chóng)來(lái)說(shuō)不是必需的,但它們是我這次需要的)
  3.matplotlib(用于可視化)
  4.datetime(準時(shí)運行)
  5.Pandas(python強大的數據處理庫)
  6.os(在系統上運行)
 ?。ㄎ腋矚g原來(lái)的re庫,當然這里使用正則表達式可以解決所有問(wèn)題)
  你需要知道的:
  1.python 語(yǔ)法基礎
  2.正則表達式匹配規則
 ?。ㄅ佬袆?dòng)物不需要以下內容)
  3.datetime 一些基本函數
  4.Matplotlib 可視化操作(雖然這對于非爬蟲(chóng)來(lái)說(shuō)是必須的,但很多情況下數據可視化會(huì )讓數據更直觀(guān),更容易做出判斷)
  5.pandas庫的基本使用(非爬蟲(chóng)必備,數據分析必備)
  五、網(wǎng)頁(yè)分析
  首先我們打開(kāi)我們的目標頁(yè)面→萬(wàn)科百度百科歷史版。
  好像一切正??常,然后我們查看url,也有前面提到的規則,但是真的一切正常嗎?
  如果你把這個(gè)頁(yè)面做為靜態(tài)頁(yè)面,那肯定是注定要失敗的,因為我從一開(kāi)始就是這樣做的,當你在第一頁(yè)查找代碼時(shí),你會(huì )發(fā)現一切正常,但是當你在第二頁(yè)查找代碼時(shí)page 有時(shí),您會(huì )發(fā)現一個(gè)事實(shí),即您在第二頁(yè)甚至最后一頁(yè)上看到的最后一個(gè)代碼是相同的。你覺(jué)得這有悖常理嗎?
  六、關(guān)注
  事實(shí)上,事實(shí)并非如此。這是正常的事情。很多頁(yè)面會(huì )做成動(dòng)態(tài)的,使用json或者其他文件來(lái)傳輸數據(不準確,也可能使用java、JavaScript等代碼調用端口等),這樣比較安全。
  此時(shí)很多人會(huì )選擇使用fiddle等第三方軟件抓包,比較方便,但是這里筆者比較難,所以直接在控制器平臺上觀(guān)看即可。
  經(jīng)過(guò)一番搜索,我們鎖定了幾個(gè)我們需要的文件和 xhr 文件。
  很多網(wǎng)頁(yè)的數據都會(huì )隱藏在json中。這可能是一樣的嗎?當然檢查后失敗了,然后我們看xhr,發(fā)現這個(gè)很熟悉的字段(當然我可能很熟悉)
  顯而易見(jiàn)的答案就在這里,只需解釋一下
  獲取歷史列表,獲取歷史數據
  我猜這個(gè)東西是萬(wàn)科的quantio語(yǔ)句(不知道這個(gè)詞是不是拼錯了,不過(guò)我用的很少,前后端工作的朋友可能知道)
  Lemmald,這不就是萬(wàn)科在百度的號碼嗎?
  一看就知道是第七頁(yè)
  大小顯示 25 條消息
  這個(gè)發(fā)現很棒,解決了很多問(wèn)題。
  七、假的
  作為爬蟲(chóng),了解反爬蟲(chóng)套路是非常有必要的。如果你在xhr上進(jìn)行正常爬蟲(chóng),你會(huì )發(fā)現返回給你的是{error: xxxxx},此時(shí)你應該警惕,這證明你的機器人的身份被百度識破了,它拒絕了給你數據,所以我們需要做一些簡(jiǎn)單的偽裝。前面已經(jīng)講過(guò)改頭文件了,這次我會(huì )多講。
  1.headers 偽裝,服務(wù)器使用它來(lái)確定您正在使用的瀏覽器。當出現這種情況時(shí),服務(wù)器會(huì )認為這是來(lái)自瀏覽器的正常請求。
  2.Referer:瀏覽器使用它來(lái)確定您從哪個(gè)網(wǎng)頁(yè)跳轉。
  3.ip偽裝,這個(gè)只要構造好ip池就沒(méi)有問(wèn)題。
  4.cookie偽裝,cookie被服務(wù)器用來(lái)識別你當前的狀態(tài),比如你是否已經(jīng)登錄等。每次你向服務(wù)器請求cookie時(shí),都會(huì )相應更新。
  最常用的就是上面這些了,從上到下越來(lái)越難調整了。面對百度,光改headers顯然是不夠的,于是加了Referer和cookie碼(關(guān)鍵是兩個(gè)月前就建立了。IP池已經(jīng)廢掉了,懶得整)。
  好了,到這里我們發(fā)現可以正常獲取數據了。
  八、文本匹配
  不得不說(shuō),在解決了以上問(wèn)題之后,文本匹配就變成了最簡(jiǎn)單的事情。
  其實(shí)這是一種類(lèi)似字典的格式,但是作者懶得想了,決定用一個(gè)簡(jiǎn)單粗暴的正則表達式。
  九、轉換時(shí)間戳
  這時(shí)候我們就會(huì )發(fā)現,creattime給出的時(shí)間到底是什么鬼?
  但如果你仔細想想,你會(huì )發(fā)現它是一個(gè)時(shí)間戳
  python 中的時(shí)間戳:自 1/1/1970 12:00AM 以來(lái)的秒數
  是不是很破?
  幸運的是,解決這個(gè)問(wèn)題只需要幾段簡(jiǎn)短的代碼
  輸入時(shí)間戳,好了,問(wèn)題解決了。
  十、繪圖和csv
  圖片
  CSV
  十個(gè)一、總結和代碼
  感覺(jué)這次爬蟲(chóng)還行。兩個(gè)多月后想起來(lái)也不容易。寫(xiě)這個(gè)博客純粹是一個(gè)評論。至于怎么做圖和怎么做csv的原因,我可以說(shuō)博主是不是突然不想寫(xiě)了?
  這是代碼:
 ?。ㄗⅲ翰┲鲬械脤?xiě)評論了,不明白的可以評論提問(wèn),謝謝)
  ———————————————
  版權聲明:本文為CSDN博主“獨孤天”的原創(chuàng )文章,遵循CC4.0 BY-SA版權協(xié)議。轉載請附上原文出處鏈接和本聲明。
  原文鏈接: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度百科的歷史記錄,結果在時(shí)隔四個(gè)月之后再次遇到的對手)
  動(dòng)態(tài)頁(yè)面爬取
  很久沒(méi)有寫(xiě)爬蟲(chóng)了。今天敲了一個(gè)爬蟲(chóng)——爬百度百科的歷史記錄。結果時(shí)隔四個(gè)月再次遇到的對手居然是動(dòng)態(tài)頁(yè)面(我一開(kāi)始覺(jué)得百度太簡(jiǎn)單了。),但經(jīng)過(guò)一番努力,還是達到了自己的目標,然后就寫(xiě)了博客作為評論。
  一、概念
  動(dòng)態(tài)頁(yè)面實(shí)際上是相對于靜態(tài)頁(yè)面的。面對靜態(tài)頁(yè)面時(shí),直接查看響應一般是網(wǎng)頁(yè)的整個(gè)代碼,而對于動(dòng)態(tài)頁(yè)面則不然。一般來(lái)說(shuō),當再次打開(kāi)動(dòng)態(tài)頁(yè)面的響應時(shí),會(huì )與您在網(wǎng)頁(yè)上看到的有所不同。
  二、練習和練習前
  因為我很喜歡練習,所以我會(huì )一言不發(fā)地練習,練習會(huì )給你真正的知識,你多練習就會(huì )明白。
  目標頁(yè)面:萬(wàn)科百度百科歷史版
  實(shí)現環(huán)境:win32
  版本:python 3.6.2
  實(shí)用目標:獲取萬(wàn)科百度百科歷史版的歷史修改時(shí)間,制作圖表或csv文件
  三、流程說(shuō)明
  和所有爬蟲(chóng)一樣,我們的第一步會(huì )是分析網(wǎng)頁(yè),因為我們的目標選擇的是動(dòng)態(tài)網(wǎng)頁(yè),所以我們還需要跟蹤json文件等等。
  過(guò)程:
  1、網(wǎng)頁(yè)分析
  2、查詢(xún)、跟蹤json等文件或xhr
  3、 用于文本匹配
  4、繪制或制作 csv
  四、工具準備
  我們需要的庫是(所有最新版本):
  1.請求
  2.回復
 ?。ㄒ韵聨鞂τ谂老x(chóng)來(lái)說(shuō)不是必需的,但它們是我這次需要的)
  3.matplotlib(用于可視化)
  4.datetime(準時(shí)運行)
  5.Pandas(python強大的數據處理庫)
  6.os(在系統上運行)
 ?。ㄎ腋矚g原來(lái)的re庫,當然這里使用正則表達式可以解決所有問(wèn)題)
  你需要知道的:
  1.python 語(yǔ)法基礎
  2.正則表達式匹配規則
 ?。ㄅ佬袆?dòng)物不需要以下內容)
  3.datetime 一些基本函數
  4.Matplotlib 可視化操作(雖然這對于非爬蟲(chóng)來(lái)說(shuō)是必須的,但很多情況下數據可視化會(huì )讓數據更直觀(guān),更容易做出判斷)
  5.pandas庫的基本使用(非爬蟲(chóng)必備,數據分析必備)
  五、網(wǎng)頁(yè)分析
  首先我們打開(kāi)我們的目標頁(yè)面→萬(wàn)科百度百科歷史版。
  好像一切正??常,然后我們查看url,也有前面提到的規則,但是真的一切正常嗎?
  如果你把這個(gè)頁(yè)面做為靜態(tài)頁(yè)面,那肯定是注定要失敗的,因為我從一開(kāi)始就是這樣做的,當你在第一頁(yè)查找代碼時(shí),你會(huì )發(fā)現一切正常,但是當你在第二頁(yè)查找代碼時(shí)page 有時(shí),您會(huì )發(fā)現一個(gè)事實(shí),即您在第二頁(yè)甚至最后一頁(yè)上看到的最后一個(gè)代碼是相同的。你覺(jué)得這有悖常理嗎?
  六、關(guān)注
  事實(shí)上,事實(shí)并非如此。這是正常的事情。很多頁(yè)面會(huì )做成動(dòng)態(tài)的,使用json或者其他文件來(lái)傳輸數據(不準確,也可能使用java、JavaScript等代碼調用端口等),這樣比較安全。
  此時(shí)很多人會(huì )選擇使用fiddle等第三方軟件抓包,比較方便,但是這里筆者比較難,所以直接在控制器平臺上觀(guān)看即可。
  經(jīng)過(guò)一番搜索,我們鎖定了幾個(gè)我們需要的文件和 xhr 文件。
  很多網(wǎng)頁(yè)的數據都會(huì )隱藏在json中。這可能是一樣的嗎?當然檢查后失敗了,然后我們看xhr,發(fā)現這個(gè)很熟悉的字段(當然我可能很熟悉)
  顯而易見(jiàn)的答案就在這里,只需解釋一下
  獲取歷史列表,獲取歷史數據
  我猜這個(gè)東西是萬(wàn)科的quantio語(yǔ)句(不知道這個(gè)詞是不是拼錯了,不過(guò)我用的很少,前后端工作的朋友可能知道)
  Lemmald,這不就是萬(wàn)科在百度的號碼嗎?
  一看就知道是第七頁(yè)
  大小顯示 25 條消息
  這個(gè)發(fā)現很棒,解決了很多問(wèn)題。
  七、假的
  作為爬蟲(chóng),了解反爬蟲(chóng)套路是非常有必要的。如果你在xhr上進(jìn)行正常爬蟲(chóng),你會(huì )發(fā)現返回給你的是{error: xxxxx},此時(shí)你應該警惕,這證明你的機器人的身份被百度識破了,它拒絕了給你數據,所以我們需要做一些簡(jiǎn)單的偽裝。前面已經(jīng)講過(guò)改頭文件了,這次我會(huì )多講。
  1.headers 偽裝,服務(wù)器使用它來(lái)確定您正在使用的瀏覽器。當出現這種情況時(shí),服務(wù)器會(huì )認為這是來(lái)自瀏覽器的正常請求。
  2.Referer:瀏覽器使用它來(lái)確定您從哪個(gè)網(wǎng)頁(yè)跳轉。
  3.ip偽裝,這個(gè)只要構造好ip池就沒(méi)有問(wèn)題。
  4.cookie偽裝,cookie被服務(wù)器用來(lái)識別你當前的狀態(tài),比如你是否已經(jīng)登錄等。每次你向服務(wù)器請求cookie時(shí),都會(huì )相應更新。
  最常用的就是上面這些了,從上到下越來(lái)越難調整了。面對百度,光改headers顯然是不夠的,于是加了Referer和cookie碼(關(guān)鍵是兩個(gè)月前就建立了。IP池已經(jīng)廢掉了,懶得整)。
  好了,到這里我們發(fā)現可以正常獲取數據了。
  八、文本匹配
  不得不說(shuō),在解決了以上問(wèn)題之后,文本匹配就變成了最簡(jiǎn)單的事情。
  其實(shí)這是一種類(lèi)似字典的格式,但是作者懶得想了,決定用一個(gè)簡(jiǎn)單粗暴的正則表達式。
  九、轉換時(shí)間戳
  這時(shí)候我們就會(huì )發(fā)現,creattime給出的時(shí)間到底是什么鬼?
  但如果你仔細想想,你會(huì )發(fā)現它是一個(gè)時(shí)間戳
  python 中的時(shí)間戳:自 1/1/1970 12:00AM 以來(lái)的秒數
  是不是很破?
  幸運的是,解決這個(gè)問(wèn)題只需要幾段簡(jiǎn)短的代碼
  輸入時(shí)間戳,好了,問(wèn)題解決了。
  十、繪圖和csv
  圖片
  CSV
  十個(gè)一、總結和代碼
  感覺(jué)這次爬蟲(chóng)還行。兩個(gè)多月后想起來(lái)也不容易。寫(xiě)這個(gè)博客純粹是一個(gè)評論。至于怎么做圖和怎么做csv的原因,我可以說(shuō)博主是不是突然不想寫(xiě)了?
  這是代碼:
 ?。ㄗⅲ翰┲鲬械脤?xiě)評論了,不明白的可以評論提問(wèn),謝謝)
  ———————————————
  版權聲明:本文為CSDN博主“獨孤天”的原創(chuàng )文章,遵循CC4.0 BY-SA版權協(xié)議。轉載請附上原文出處鏈接和本聲明。
  原文鏈接:

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度貼模塊詳細解析(一)_社會(huì )萬(wàn)象_光明網(wǎng) )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 85 次瀏覽 ? 2022-02-05 23:19 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度貼模塊詳細解析(一)_社會(huì )萬(wàn)象_光明網(wǎng)
)
  目錄概覽
  爬取百度貼吧每篇博文的所有圖片。
  準備所需模塊,涉及知識點(diǎn),運行效果
  控制臺打?。?br />   
  計算機本地文件:
  
  完成爬蟲(chóng)1.分析網(wǎng)頁(yè)
  打開(kāi)百度貼吧搜索關(guān)鍵字,這里的例子是python,也可以是其他關(guān)鍵字
  分析前三個(gè)頁(yè)面的url,得到:
  # 第1頁(yè):http://tieba.baidu.com/f%3Fkw% ... n%3D0
# 第2頁(yè):http://tieba.baidu.com/f%3Fkw% ... %3D50
# 第3頁(yè):http://tieba.baidu.com/f%3Fkw% ... 3D100
# 比較三者三者可以得出每一頁(yè)的網(wǎng)址公式:
# "http://tieba.baidu.com/f%3Fkw% ... 3B%2B(page_index-1)*50
# 其中tieba_name是你要搜索的貼吧名字,page_index是你要搜索的第幾頁(yè)
  得到每個(gè)頁(yè)面的URL后,下一步就是分析每個(gè)帖子在特定頁(yè)面上的鏈接:
  
  已經(jīng)可以通過(guò)頁(yè)面的 URL 請求源代碼。在源碼中,可以通過(guò)xpath表達式提取出一串數字,然后組裝出具體帖子頁(yè)面的URL。
  點(diǎn)擊帖子進(jìn)入具體頁(yè)面,索取源碼然后提取圖片鏈接:
  
  這樣想:
  首先根據貼吧的名字獲取貼吧的URL,然后組裝各個(gè)頁(yè)面的URL,然后根據各個(gè)頁(yè)面的URL請求頁(yè)面的HTML源代碼,然后在源碼中提取每個(gè)帖子的URL超鏈接信息,然后組裝帖子每個(gè)具體頁(yè)面的URL,然后請求帖子具體頁(yè)面的HMTL源代碼,提取圖片的超鏈接,然后根據圖片的超鏈接下載圖片。
  2.爬蟲(chóng)代碼
  import urllib.parse
import urllib.request
from lxml import etree
# 爬蟲(chóng)實(shí)踐:爬取百度貼吧的圖片
class Spider():
def __init__(self):
self.tiebaName = "java"
self.pageNumber = 3
self.url = "http://tieba.baidu.com/f?"
self.fileName = 1
def tiebaSpider(self):
"""構造URL"""
for page_index in range(1, self.pageNumber + 1):
pn = (page_index - 1) * 50
wo = {"pn": pn, "kw": self.tiebaName}
word = urllib.parse.urlencode(wo)
tieba_url = self.url + word
self.loadPage(tieba_url)
def loadPage(self, url):
"""爬取頁(yè)面內容"""
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//div[@class=&#39;threadlist_lz clearfix&#39;]/div/a/@href")
for link in links:
link = "http://tieba.baidu.com" + link
self.loadImages(link)
def loadImages(self, link):
"""爬取帖子詳情頁(yè),獲得圖片的鏈接"""
req = urllib.request.Request(link)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//img[@class=&#39;BDE_Image&#39;]/@src")
for image_link in links:
self.writeImages(image_link)
def writeImages(self, imageslink):
"""通過(guò)圖片的鏈接,爬取圖片并保存在本地"""
print("正在存儲圖片:", self.fileName, "......")
image = urllib.request.urlopen(imageslink).read()
file = open(r"C:\\Users\\Administrator\\Pictures\\img\\" + str(self.fileName) + ".jpg", "wb")
file.write(image)
file.close()
self.fileName += 1
if __name__ == &#39;__main__&#39;:
# 實(shí)例化Spider類(lèi)
mySpider = Spider()
# 調用方法
mySpider.tiebaSpider() 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度貼模塊詳細解析(一)_社會(huì )萬(wàn)象_光明網(wǎng)
)
  目錄概覽
  爬取百度貼吧每篇博文的所有圖片。
  準備所需模塊,涉及知識點(diǎn),運行效果
  控制臺打?。?br />   
  計算機本地文件:
  
  完成爬蟲(chóng)1.分析網(wǎng)頁(yè)
  打開(kāi)百度貼吧搜索關(guān)鍵字,這里的例子是python,也可以是其他關(guān)鍵字
  分析前三個(gè)頁(yè)面的url,得到:
  # 第1頁(yè):http://tieba.baidu.com/f%3Fkw% ... n%3D0
# 第2頁(yè):http://tieba.baidu.com/f%3Fkw% ... %3D50
# 第3頁(yè):http://tieba.baidu.com/f%3Fkw% ... 3D100
# 比較三者三者可以得出每一頁(yè)的網(wǎng)址公式:
# "http://tieba.baidu.com/f%3Fkw% ... 3B%2B(page_index-1)*50
# 其中tieba_name是你要搜索的貼吧名字,page_index是你要搜索的第幾頁(yè)
  得到每個(gè)頁(yè)面的URL后,下一步就是分析每個(gè)帖子在特定頁(yè)面上的鏈接:
  
  已經(jīng)可以通過(guò)頁(yè)面的 URL 請求源代碼。在源碼中,可以通過(guò)xpath表達式提取出一串數字,然后組裝出具體帖子頁(yè)面的URL。
  點(diǎn)擊帖子進(jìn)入具體頁(yè)面,索取源碼然后提取圖片鏈接:
  
  這樣想:
  首先根據貼吧的名字獲取貼吧的URL,然后組裝各個(gè)頁(yè)面的URL,然后根據各個(gè)頁(yè)面的URL請求頁(yè)面的HTML源代碼,然后在源碼中提取每個(gè)帖子的URL超鏈接信息,然后組裝帖子每個(gè)具體頁(yè)面的URL,然后請求帖子具體頁(yè)面的HMTL源代碼,提取圖片的超鏈接,然后根據圖片的超鏈接下載圖片。
  2.爬蟲(chóng)代碼
  import urllib.parse
import urllib.request
from lxml import etree
# 爬蟲(chóng)實(shí)踐:爬取百度貼吧的圖片
class Spider():
def __init__(self):
self.tiebaName = "java"
self.pageNumber = 3
self.url = "http://tieba.baidu.com/f?"
self.fileName = 1
def tiebaSpider(self):
"""構造URL"""
for page_index in range(1, self.pageNumber + 1):
pn = (page_index - 1) * 50
wo = {"pn": pn, "kw": self.tiebaName}
word = urllib.parse.urlencode(wo)
tieba_url = self.url + word
self.loadPage(tieba_url)
def loadPage(self, url):
"""爬取頁(yè)面內容"""
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//div[@class=&#39;threadlist_lz clearfix&#39;]/div/a/@href")
for link in links:
link = "http://tieba.baidu.com" + link
self.loadImages(link)
def loadImages(self, link):
"""爬取帖子詳情頁(yè),獲得圖片的鏈接"""
req = urllib.request.Request(link)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//img[@class=&#39;BDE_Image&#39;]/@src")
for image_link in links:
self.writeImages(image_link)
def writeImages(self, imageslink):
"""通過(guò)圖片的鏈接,爬取圖片并保存在本地"""
print("正在存儲圖片:", self.fileName, "......")
image = urllib.request.urlopen(imageslink).read()
file = open(r"C:\\Users\\Administrator\\Pictures\\img\\" + str(self.fileName) + ".jpg", "wb")
file.write(image)
file.close()
self.fileName += 1
if __name__ == &#39;__main__&#39;:
# 實(shí)例化Spider類(lèi)
mySpider = Spider()
# 調用方法
mySpider.tiebaSpider()

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(項目工具Python3.7.1、JetBrainsPyCharm三、項目過(guò)程(四))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 87 次瀏覽 ? 2022-02-05 03:09 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(項目工具Python3.7.1、JetBrainsPyCharm三、項目過(guò)程(四))
  需要編寫(xiě)的程序可以在任意一個(gè)貼吧頁(yè)面獲取帖子鏈接,抓取用戶(hù)在帖子中發(fā)布的圖片。在這個(gè)過(guò)程中,通過(guò)用戶(hù)代理進(jìn)行偽裝和輪換,解決了爬蟲(chóng)ip被目標網(wǎng)站封禁的問(wèn)題。熟悉基本的網(wǎng)頁(yè)和url分析,能靈活使用Xmind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖。
  一、項目分析
  1. 網(wǎng)絡(luò )分析
  貼吧頁(yè)面簡(jiǎn)潔,所有內容一目了然,比其他社區論壇更容易使用。注冊容易,甚至不注冊,發(fā)布也容易。但是,欄目創(chuàng )建不均,內容五花八門(mén)。
  2. 網(wǎng)址解析
  分析貼吧中post鏈接的拼接形式,在程序中重構post鏈接。
  比如在本例的實(shí)驗中,多次輸入不同的貼吧后,可以看出貼吧的鏈接組成為:fullurl=url+key。其中 fullurl 表示 貼吧 總鏈接
  url為貼吧鏈接的社區:
  關(guān)鍵是urlencode編碼的貼吧中文名
  使用 xpath_helper_2_0_2.crx 瀏覽器插件,帖子的鏈接條目可以歸結為:
  "//li/div[@class="t_con cleafix"]/div/div/div/a/@href",用戶(hù)在帖子中張貼的圖片鏈接表達式為:"//img··[@class = "BDE_Image"]/@src"
  二、項目工具
  Python 3.7.1,JetBrains PyCharm 2018.3.2
  三、項目流程
 ?。ㄒ唬┦褂肵mind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖,繪制程序邏輯框架圖如圖4-1
  
  圖 4-1 程序邏輯框架圖
 ?。ǘ┡老x(chóng)調試過(guò)程的Bug描述(截圖)
  
  (三)爬蟲(chóng)運行結果
  
  
  (四)項目經(jīng)歷
  本次實(shí)驗的經(jīng)驗總結如下:
  1、 當程序運行結果提示錯誤:ModuleNotFoundError: No module named 'lxml'時(shí),最好的解決辦法是先檢查lxml是否安裝,再檢查lxml是否導入。在本次實(shí)驗中,由于項目可以成功導入lxml,解決方案如圖5-1所示。在“Project Interperter”中選擇python安裝目錄。
  
  圖 5-1 錯誤解決流程
  2、 有時(shí)候需要模擬瀏覽器,否則做過(guò)反爬的網(wǎng)站 會(huì )知道你是機器人
  例如,對于瀏覽器的限制,我們可以設置 User-Agent 頭。對于防盜鏈限制,我們可以設置Referer頭。一些網(wǎng)站使用cookies進(jìn)行限制,主要涉及登錄和限流。沒(méi)有通用的方法,只看能不能自動(dòng)登錄或者分析cookies的問(wèn)題。
  3、 第一步,我們可以從主界面的html代碼中提取出這組圖片的鏈接地址。顯然,我們需要使用正則表達式來(lái)提取這些不同的地址。然后,有了每組圖片的起始地址后,我們進(jìn)入子頁(yè)面,刷新網(wǎng)頁(yè),觀(guān)察它的加載過(guò)程。
  四、項目源碼
  貼吧pic.py
  from urllib import request,parse
import ssl
import random
import time
from lxml import etree
ua_list=[
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;,
&#39;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)&#39;,
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
]
def loadPage(url):
userAgent=random.choice(ua_list)
headers={"User-Agent":userAgent}
req =request.Request(url,headers=headers)
context=ssl._create_unverified_context()
response=request.urlopen(req,context=context)
html=response.read()
content=etree.HTML(html)
link_list=content.xpath(&#39;//li/div[@class="t_con cleafix"]/div/div/div/a/@href&#39;)
for link in link_list:
fullurl=&#39;http://tieba.baidu.com&#39;+link
print(fullurl)
loadImge(fullurl)
def loadImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
html = response.read()
content = etree.HTML(html)
link_list = content.xpath(&#39;//img[@class="BDE_Image"]/@src&#39;)
for link in link_list:
print(link)
writeImge(link)
def writeImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
image = response.read()
filename=url[-12:]
f=open(filename,&#39;wb&#39;)
f.write(image)
f.close()
def tiebaSpider(url,beginPage,endPage):
for page in range(beginPage,endPage+100):
pn=(page-1)*50
fullurl=url+"&pn="+str(pn)
loadPage(fullurl)
if __name__=="__main__":
print("測試成功!")
kw=input("請輸入要爬的貼吧名:")
beginPage=int(input("請輸入開(kāi)始頁(yè):"))
endPage = int(input("請輸入結束頁(yè):"))
url="http://tieba.baidu.com/f?"
key=parse.urlencode({"kw":kw})
fullurl=url+key
tiebaSpider(fullurl,beginPage,endPage)
  轉載于: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(項目工具Python3.7.1、JetBrainsPyCharm三、項目過(guò)程(四))
  需要編寫(xiě)的程序可以在任意一個(gè)貼吧頁(yè)面獲取帖子鏈接,抓取用戶(hù)在帖子中發(fā)布的圖片。在這個(gè)過(guò)程中,通過(guò)用戶(hù)代理進(jìn)行偽裝和輪換,解決了爬蟲(chóng)ip被目標網(wǎng)站封禁的問(wèn)題。熟悉基本的網(wǎng)頁(yè)和url分析,能靈活使用Xmind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖。
  一、項目分析
  1. 網(wǎng)絡(luò )分析
  貼吧頁(yè)面簡(jiǎn)潔,所有內容一目了然,比其他社區論壇更容易使用。注冊容易,甚至不注冊,發(fā)布也容易。但是,欄目創(chuàng )建不均,內容五花八門(mén)。
  2. 網(wǎng)址解析
  分析貼吧中post鏈接的拼接形式,在程序中重構post鏈接。
  比如在本例的實(shí)驗中,多次輸入不同的貼吧后,可以看出貼吧的鏈接組成為:fullurl=url+key。其中 fullurl 表示 貼吧 總鏈接
  url為貼吧鏈接的社區:
  關(guān)鍵是urlencode編碼的貼吧中文名
  使用 xpath_helper_2_0_2.crx 瀏覽器插件,帖子的鏈接條目可以歸結為:
  "//li/div[@class="t_con cleafix"]/div/div/div/a/@href",用戶(hù)在帖子中張貼的圖片鏈接表達式為:"//img··[@class = "BDE_Image"]/@src"
  二、項目工具
  Python 3.7.1,JetBrains PyCharm 2018.3.2
  三、項目流程
 ?。ㄒ唬┦褂肵mind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖,繪制程序邏輯框架圖如圖4-1
  
  圖 4-1 程序邏輯框架圖
 ?。ǘ┡老x(chóng)調試過(guò)程的Bug描述(截圖)
  
  (三)爬蟲(chóng)運行結果
  
  
  (四)項目經(jīng)歷
  本次實(shí)驗的經(jīng)驗總結如下:
  1、 當程序運行結果提示錯誤:ModuleNotFoundError: No module named 'lxml'時(shí),最好的解決辦法是先檢查lxml是否安裝,再檢查lxml是否導入。在本次實(shí)驗中,由于項目可以成功導入lxml,解決方案如圖5-1所示。在“Project Interperter”中選擇python安裝目錄。
  
  圖 5-1 錯誤解決流程
  2、 有時(shí)候需要模擬瀏覽器,否則做過(guò)反爬的網(wǎng)站 會(huì )知道你是機器人
  例如,對于瀏覽器的限制,我們可以設置 User-Agent 頭。對于防盜鏈限制,我們可以設置Referer頭。一些網(wǎng)站使用cookies進(jìn)行限制,主要涉及登錄和限流。沒(méi)有通用的方法,只看能不能自動(dòng)登錄或者分析cookies的問(wèn)題。
  3、 第一步,我們可以從主界面的html代碼中提取出這組圖片的鏈接地址。顯然,我們需要使用正則表達式來(lái)提取這些不同的地址。然后,有了每組圖片的起始地址后,我們進(jìn)入子頁(yè)面,刷新網(wǎng)頁(yè),觀(guān)察它的加載過(guò)程。
  四、項目源碼
  貼吧pic.py
  from urllib import request,parse
import ssl
import random
import time
from lxml import etree
ua_list=[
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;,
&#39;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)&#39;,
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
]
def loadPage(url):
userAgent=random.choice(ua_list)
headers={"User-Agent":userAgent}
req =request.Request(url,headers=headers)
context=ssl._create_unverified_context()
response=request.urlopen(req,context=context)
html=response.read()
content=etree.HTML(html)
link_list=content.xpath(&#39;//li/div[@class="t_con cleafix"]/div/div/div/a/@href&#39;)
for link in link_list:
fullurl=&#39;http://tieba.baidu.com&#39;+link
print(fullurl)
loadImge(fullurl)
def loadImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
html = response.read()
content = etree.HTML(html)
link_list = content.xpath(&#39;//img[@class="BDE_Image"]/@src&#39;)
for link in link_list:
print(link)
writeImge(link)
def writeImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
image = response.read()
filename=url[-12:]
f=open(filename,&#39;wb&#39;)
f.write(image)
f.close()
def tiebaSpider(url,beginPage,endPage):
for page in range(beginPage,endPage+100):
pn=(page-1)*50
fullurl=url+"&pn="+str(pn)
loadPage(fullurl)
if __name__=="__main__":
print("測試成功!")
kw=input("請輸入要爬的貼吧名:")
beginPage=int(input("請輸入開(kāi)始頁(yè):"))
endPage = int(input("請輸入結束頁(yè):"))
url="http://tieba.baidu.com/f?"
key=parse.urlencode({"kw":kw})
fullurl=url+key
tiebaSpider(fullurl,beginPage,endPage)
  轉載于:

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬蟲(chóng)的爬取步驟:具體的步驟-爬蟲(chóng)知乎圖片 )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 83 次瀏覽 ? 2022-02-04 10:11 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬蟲(chóng)的爬取步驟:具體的步驟-爬蟲(chóng)知乎圖片
)
  爬蟲(chóng)的爬取步驟:具體步驟:代碼示例:
  headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')
targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')
復制代碼
  完整代碼:
  這是一個(gè)爬取知乎圖片的教程代碼,涉及到代理ip文件(IP.txt)
  import requests,random,os,time
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
#獲取IP列表并檢驗IP的有效性
def get_ip_list():
f=open('IP.txt','r')
ip_list=f.readlines()
f.close()
return ip_list

#從IP列表中獲取隨機IP
def get_random_ip(ip_list):
proxy_ip = random.choice(ip_list)
proxy_ip=proxy_ip.strip('\n')
proxies = {'https': proxy_ip}
return proxies

def get_picture(url,ip_list):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')

targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')

#保存圖片鏈接
list_url = []
for each in targets_url:
list_url.append(each.img.get('src'))

for each_img in list_url:
#判斷文件夾(圖庫)是否存在,若不存在則創(chuàng )建文件夾
if '圖庫' not in os.listdir():
os.makedirs('圖庫')
#下載圖片
proxies = get_random_ip(ip_list)
picture = '%s.jpg' % time.time()
req = requests.get(url=each_img,headers=headers,proxies=proxies)
with open('圖庫/{}.jpg'.format(picture),'wb') as f:
f.write(req.content)
#每爬取一張圖片暫停一秒防止ip被封
time.sleep(1)
print('{}下載完成!'.format(picture))

def main():
ip_list = get_ip_list()
url = 'https://www.zhihu.com/question/22918070'
get_picture(url,ip_list)

if __name__ == '__main__':
main()
復制代碼
  成功后截圖:
  
  爬行動(dòng)物簡(jiǎn)介:
  網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛,是一種用于自動(dòng)瀏覽萬(wàn)維網(wǎng)的網(wǎng)絡(luò )機器人。Web 爬蟲(chóng)從稱(chēng)為種子的統一資源地址 (URL) 列表開(kāi)始。當網(wǎng)絡(luò )爬蟲(chóng)訪(fǎng)問(wèn)這些統一的資源定位器時(shí),它們會(huì )識別頁(yè)面上的所有超鏈接,并將它們寫(xiě)入一個(gè)“訪(fǎng)問(wèn)列表”,即所謂的爬取域。此域上的 URL 將根據一組策略以循環(huán)方式訪(fǎng)問(wèn)。如果爬蟲(chóng)在執行過(guò)程中復制存檔上的信息并保存網(wǎng)站,這些存檔通常會(huì )被存儲起來(lái),以便于查看。閱讀和瀏覽他們存儲在 網(wǎng)站 上的信息并立即更新。這些存儲的網(wǎng)頁(yè)也稱(chēng)為“快照”。較大的網(wǎng)頁(yè)意味著(zhù)網(wǎng)絡(luò )爬蟲(chóng)在給定時(shí)間內只能下載網(wǎng)頁(yè)的較小部分,因此優(yōu)先下載。高變化率意味著(zhù)頁(yè)面可能已被更新或替換。一些服務(wù)器端軟件生成的 URL(統一資源定位器)也使網(wǎng)絡(luò )爬蟲(chóng)難以避免檢索重復的內容。(來(lái)自:維基百科)
  通過(guò)代碼訪(fǎng)問(wèn)網(wǎng)頁(yè)并將頁(yè)面內容保存在本地。url是爬蟲(chóng)識別網(wǎng)頁(yè)的重要標識。通過(guò)requests.get(url)獲取網(wǎng)頁(yè)的HTML代碼,通過(guò)BeautifulSoup解析HTML文件得到我們需要的內容。find()/find_all() 是 beautifulSoup 的兩個(gè)重要方法。
  補充知識點(diǎn):
  關(guān)于爬蟲(chóng)中的headers:在使用python爬蟲(chóng)爬取數據時(shí),我們經(jīng)常會(huì )遇到一些網(wǎng)站的反爬蟲(chóng)措施,一般都是針對headers中的User-Agent。如果不設置headers,User-Agent會(huì )聲明它是python腳本,如果網(wǎng)站有反爬蟲(chóng)的想法,必然會(huì )拒絕這樣的連接。通過(guò)修改headers,可以將自己的爬蟲(chóng)腳本偽裝成瀏覽器的正常訪(fǎng)問(wèn)來(lái)避免這個(gè)問(wèn)題。
  關(guān)于爬蟲(chóng)中的IP/代理: 設置好用戶(hù)代理后,應該考慮另一個(gè)問(wèn)題。程序的運行速度非???。如果我們使用爬蟲(chóng)程序來(lái)爬取網(wǎng)站中的東西,一個(gè)固定IP的訪(fǎng)問(wèn)頻率會(huì )很高,不符合人工操作的標準,因為人工操作不可能在內部進(jìn)行如此頻繁的訪(fǎng)問(wèn)幾毫秒。所以有些網(wǎng)站會(huì )設置IP訪(fǎng)問(wèn)頻率的閾值。如果某個(gè)IP的訪(fǎng)問(wèn)頻率超過(guò)了這個(gè)閾值,則說(shuō)明這不是人在訪(fǎng)問(wèn),而是爬蟲(chóng)。因此,當我們需要爬取大量數據時(shí),一個(gè)不斷變化的IP機制是必不可少的。我的代碼中的 IP.txt 文件就是為此機制準備的。
  關(guān)于 BeautifulSoup: 簡(jiǎn)單來(lái)說(shuō),Beautiful Soup 是一個(gè) Python 庫,其主要功能是從網(wǎng)頁(yè)中抓取數據。
  BeautifulSoup 的安裝:
  pip install beautifulsoup4
復制代碼 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬蟲(chóng)的爬取步驟:具體的步驟-爬蟲(chóng)知乎圖片
)
  爬蟲(chóng)的爬取步驟:具體步驟:代碼示例:
  headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')
targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')
復制代碼
  完整代碼:
  這是一個(gè)爬取知乎圖片的教程代碼,涉及到代理ip文件(IP.txt)
  import requests,random,os,time
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
#獲取IP列表并檢驗IP的有效性
def get_ip_list():
f=open('IP.txt','r')
ip_list=f.readlines()
f.close()
return ip_list

#從IP列表中獲取隨機IP
def get_random_ip(ip_list):
proxy_ip = random.choice(ip_list)
proxy_ip=proxy_ip.strip('\n')
proxies = {'https': proxy_ip}
return proxies

def get_picture(url,ip_list):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')

targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')

#保存圖片鏈接
list_url = []
for each in targets_url:
list_url.append(each.img.get('src'))

for each_img in list_url:
#判斷文件夾(圖庫)是否存在,若不存在則創(chuàng )建文件夾
if '圖庫' not in os.listdir():
os.makedirs('圖庫')
#下載圖片
proxies = get_random_ip(ip_list)
picture = '%s.jpg' % time.time()
req = requests.get(url=each_img,headers=headers,proxies=proxies)
with open('圖庫/{}.jpg'.format(picture),'wb') as f:
f.write(req.content)
#每爬取一張圖片暫停一秒防止ip被封
time.sleep(1)
print('{}下載完成!'.format(picture))

def main():
ip_list = get_ip_list()
url = 'https://www.zhihu.com/question/22918070'
get_picture(url,ip_list)

if __name__ == '__main__':
main()
復制代碼
  成功后截圖:
  
  爬行動(dòng)物簡(jiǎn)介:
  網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛,是一種用于自動(dòng)瀏覽萬(wàn)維網(wǎng)的網(wǎng)絡(luò )機器人。Web 爬蟲(chóng)從稱(chēng)為種子的統一資源地址 (URL) 列表開(kāi)始。當網(wǎng)絡(luò )爬蟲(chóng)訪(fǎng)問(wèn)這些統一的資源定位器時(shí),它們會(huì )識別頁(yè)面上的所有超鏈接,并將它們寫(xiě)入一個(gè)“訪(fǎng)問(wèn)列表”,即所謂的爬取域。此域上的 URL 將根據一組策略以循環(huán)方式訪(fǎng)問(wèn)。如果爬蟲(chóng)在執行過(guò)程中復制存檔上的信息并保存網(wǎng)站,這些存檔通常會(huì )被存儲起來(lái),以便于查看。閱讀和瀏覽他們存儲在 網(wǎng)站 上的信息并立即更新。這些存儲的網(wǎng)頁(yè)也稱(chēng)為“快照”。較大的網(wǎng)頁(yè)意味著(zhù)網(wǎng)絡(luò )爬蟲(chóng)在給定時(shí)間內只能下載網(wǎng)頁(yè)的較小部分,因此優(yōu)先下載。高變化率意味著(zhù)頁(yè)面可能已被更新或替換。一些服務(wù)器端軟件生成的 URL(統一資源定位器)也使網(wǎng)絡(luò )爬蟲(chóng)難以避免檢索重復的內容。(來(lái)自:維基百科)
  通過(guò)代碼訪(fǎng)問(wèn)網(wǎng)頁(yè)并將頁(yè)面內容保存在本地。url是爬蟲(chóng)識別網(wǎng)頁(yè)的重要標識。通過(guò)requests.get(url)獲取網(wǎng)頁(yè)的HTML代碼,通過(guò)BeautifulSoup解析HTML文件得到我們需要的內容。find()/find_all() 是 beautifulSoup 的兩個(gè)重要方法。
  補充知識點(diǎn):
  關(guān)于爬蟲(chóng)中的headers:在使用python爬蟲(chóng)爬取數據時(shí),我們經(jīng)常會(huì )遇到一些網(wǎng)站的反爬蟲(chóng)措施,一般都是針對headers中的User-Agent。如果不設置headers,User-Agent會(huì )聲明它是python腳本,如果網(wǎng)站有反爬蟲(chóng)的想法,必然會(huì )拒絕這樣的連接。通過(guò)修改headers,可以將自己的爬蟲(chóng)腳本偽裝成瀏覽器的正常訪(fǎng)問(wèn)來(lái)避免這個(gè)問(wèn)題。
  關(guān)于爬蟲(chóng)中的IP/代理: 設置好用戶(hù)代理后,應該考慮另一個(gè)問(wèn)題。程序的運行速度非???。如果我們使用爬蟲(chóng)程序來(lái)爬取網(wǎng)站中的東西,一個(gè)固定IP的訪(fǎng)問(wèn)頻率會(huì )很高,不符合人工操作的標準,因為人工操作不可能在內部進(jìn)行如此頻繁的訪(fǎng)問(wèn)幾毫秒。所以有些網(wǎng)站會(huì )設置IP訪(fǎng)問(wèn)頻率的閾值。如果某個(gè)IP的訪(fǎng)問(wèn)頻率超過(guò)了這個(gè)閾值,則說(shuō)明這不是人在訪(fǎng)問(wèn),而是爬蟲(chóng)。因此,當我們需要爬取大量數據時(shí),一個(gè)不斷變化的IP機制是必不可少的。我的代碼中的 IP.txt 文件就是為此機制準備的。
  關(guān)于 BeautifulSoup: 簡(jiǎn)單來(lái)說(shuō),Beautiful Soup 是一個(gè) Python 庫,其主要功能是從網(wǎng)頁(yè)中抓取數據。
  BeautifulSoup 的安裝:
  pip install beautifulsoup4
復制代碼

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,怎么辦)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 71 次瀏覽 ? 2022-02-04 01:02 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,怎么辦)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,chrome/firefox/ie瀏覽器好多都是網(wǎng)頁(yè)爬蟲(chóng)自帶的api,但是uc在國內不能使用api,所以要要用第三方的爬蟲(chóng),第三方爬蟲(chóng)可以選擇友盟,talkingdata,360/uc等第三方,也可以去搜狗開(kāi)放平臺注冊使用各種第三方的爬蟲(chóng)。第三方第三方爬蟲(chóng)相對用戶(hù)的量多,獲取數據也方便。
  1.chrome、火狐或其他現有網(wǎng)頁(yè)爬蟲(chóng)2.微博爬蟲(chóng)3.第三方微博爬蟲(chóng),
  百度,騰訊和好多門(mén)戶(hù)網(wǎng)站都是自己搞一套的,
  你怎么找這些網(wǎng)站不就一目了然了,知乎還有一個(gè)私家課,可以爬教程,這種不靠譜的都是虛假廣告。
  個(gè)人比較推薦talkingdata的數據,開(kāi)放性比較好,數據質(zhì)量也不錯,并且分析邏輯比較清晰。相比于其他的要容易上手一些。但現在爬蟲(chóng)出來(lái)的報告,只適合做一個(gè)簡(jiǎn)單的數據分析用,不適合做長(cháng)遠的業(yè)務(wù)規劃。還有建議爬蟲(chóng)的時(shí)候模仿別人做好的網(wǎng)站網(wǎng)站。實(shí)在要爬的話(huà),
  火狐瀏覽器直接設置用戶(hù)過(guò)濾:
  因為瀏覽器能力有限,網(wǎng)頁(yè)爬蟲(chóng)都是如此,很多網(wǎng)站在你登錄的時(shí)候就會(huì )屏蔽爬蟲(chóng)抓取這種網(wǎng)站,只能從第三方的網(wǎng)站進(jìn)行爬取或者是聯(lián)網(wǎng)調用一些第三方的爬蟲(chóng)。當然也有不少沒(méi)有限制的,在利用插件方面用的人比較多,你可以學(xué)一學(xué)搜狗爬蟲(chóng)插件和百度爬蟲(chóng)插件,學(xué)會(huì )之后相信你自己就可以找到一些公司聯(lián)系方式。還有一個(gè)好用的東西,uc瀏覽器也是可以進(jìn)行網(wǎng)頁(yè)爬蟲(chóng),可以從網(wǎng)站爬取信息,只要能進(jìn)入的網(wǎng)站都有接口,但是功能比較簡(jiǎn)單,比如點(diǎn)開(kāi)百度,然后點(diǎn)左下角相機,打開(kāi)一個(gè)頁(yè)面圖片什么的。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,怎么辦)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,chrome/firefox/ie瀏覽器好多都是網(wǎng)頁(yè)爬蟲(chóng)自帶的api,但是uc在國內不能使用api,所以要要用第三方的爬蟲(chóng),第三方爬蟲(chóng)可以選擇友盟,talkingdata,360/uc等第三方,也可以去搜狗開(kāi)放平臺注冊使用各種第三方的爬蟲(chóng)。第三方第三方爬蟲(chóng)相對用戶(hù)的量多,獲取數據也方便。
  1.chrome、火狐或其他現有網(wǎng)頁(yè)爬蟲(chóng)2.微博爬蟲(chóng)3.第三方微博爬蟲(chóng),
  百度,騰訊和好多門(mén)戶(hù)網(wǎng)站都是自己搞一套的,
  你怎么找這些網(wǎng)站不就一目了然了,知乎還有一個(gè)私家課,可以爬教程,這種不靠譜的都是虛假廣告。
  個(gè)人比較推薦talkingdata的數據,開(kāi)放性比較好,數據質(zhì)量也不錯,并且分析邏輯比較清晰。相比于其他的要容易上手一些。但現在爬蟲(chóng)出來(lái)的報告,只適合做一個(gè)簡(jiǎn)單的數據分析用,不適合做長(cháng)遠的業(yè)務(wù)規劃。還有建議爬蟲(chóng)的時(shí)候模仿別人做好的網(wǎng)站網(wǎng)站。實(shí)在要爬的話(huà),
  火狐瀏覽器直接設置用戶(hù)過(guò)濾:
  因為瀏覽器能力有限,網(wǎng)頁(yè)爬蟲(chóng)都是如此,很多網(wǎng)站在你登錄的時(shí)候就會(huì )屏蔽爬蟲(chóng)抓取這種網(wǎng)站,只能從第三方的網(wǎng)站進(jìn)行爬取或者是聯(lián)網(wǎng)調用一些第三方的爬蟲(chóng)。當然也有不少沒(méi)有限制的,在利用插件方面用的人比較多,你可以學(xué)一學(xué)搜狗爬蟲(chóng)插件和百度爬蟲(chóng)插件,學(xué)會(huì )之后相信你自己就可以找到一些公司聯(lián)系方式。還有一個(gè)好用的東西,uc瀏覽器也是可以進(jìn)行網(wǎng)頁(yè)爬蟲(chóng),可以從網(wǎng)站爬取信息,只要能進(jìn)入的網(wǎng)站都有接口,但是功能比較簡(jiǎn)單,比如點(diǎn)開(kāi)百度,然后點(diǎn)左下角相機,打開(kāi)一個(gè)頁(yè)面圖片什么的。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(就是爬取小編精選的圖片小編精選-照片(組圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-02-03 14:16 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(就是爬取小編精選的圖片小編精選-照片(組圖))
  更好的體驗:Python 爬蟲(chóng)在行動(dòng)中 - Pixabay上的免費圖片
  
  Pixie,一個(gè)不錯的高清未經(jīng)審查的圖像網(wǎng)站,可以免費下載。
  /
  一些介紹
  超過(guò) 900,000 張高質(zhì)量的照片、插圖和矢量圖形。免費用于商業(yè)用途。無(wú)需歸屬。
  Pixabay是一個(gè)高質(zhì)量的圖片分享網(wǎng)站。網(wǎng)站 最初是由 Hans Braxmeier 和 Simon Steinberger 在德國開(kāi)發(fā)的。截至 2013 年 2 月,網(wǎng)站 有大約 70,000 張免費照片和矢量圖形,由社區中的電影制作人和插畫(huà)家提供。公司于2010年12月在德國烏爾姆成立。
  2012 年 3 月,Pixabay 開(kāi)始從私人圖片集網(wǎng)站 轉變?yōu)橹С?20 種語(yǔ)言的交互式在線(xiàn)社區 網(wǎng)站。同年5月,網(wǎng)站推出了公共應用編程接口,允許第三方用戶(hù)和網(wǎng)站開(kāi)發(fā)者搜索其圖片庫。網(wǎng)站還與 Flickr、YouTube 和 Wiki 共享資源。
  Pixabay用戶(hù)無(wú)需注冊即可獲得無(wú)版權的高質(zhì)量圖像。根據知識共享合約CC0相關(guān)的肖像權,用戶(hù)通過(guò)在本網(wǎng)站上傳圖片,默認放棄圖片版權,讓圖片得以廣泛傳播。網(wǎng)站允許任何人在未經(jīng)許可和背書(shū)的情況下使用、修改圖像——即使在商業(yè)應用中也是如此。
  為確保Pixabay上的高質(zhì)量圖片標準,用戶(hù)上傳的所有圖片都將由網(wǎng)站工作人員手動(dòng)審批。大約 27% 的用戶(hù)會(huì )說(shuō)英語(yǔ),20% 會(huì )說(shuō)西班牙語(yǔ),11% 會(huì )說(shuō)葡萄牙語(yǔ),7% 會(huì )說(shuō)德語(yǔ),5% 會(huì )說(shuō)法語(yǔ)。它的用戶(hù)主要是博主、平面設計師、作家、記者和廣告商。
  今天的目標是爬取小編的精選圖片小編的精選-圖片
  一、分析
  我們需要編寫(xiě)3個(gè)函數
  A Download(url) 下載圖片
  一個(gè)用于獲取編輯器選擇的FullUrl()總共165頁(yè)
  最后用來(lái)調用main()
  開(kāi)始一一寫(xiě)吧~
  編輯精選 - 照片
  打開(kāi)網(wǎng)頁(yè),F12,查看圖片鏈接所在的標簽
  
  
  你可以看到圖片鏈接都在那里
  標簽下,但是發(fā)現第一張和最后一張圖片的屬性不一樣,提取出來(lái)的
  “src”很好,使用xpath
  import requests
from lxml import etree
header = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36&#39;}
url = &#39;https://pixabay.com/zh/editors_choice/&#39;
r = requests.get(url,headers=header).text
s = etree.HTML(r)
print(s.xpath(&#39;//img/@src&#39;))
  結果發(fā)現
  
  前面是正確的圖片鏈接,后面卻出現'/static/img/blank.gif',這是什么鬼,查看網(wǎng)頁(yè)源代碼,搜索
  
  可以發(fā)現確實(shí)有這個(gè)字符串,我自己也花了很多時(shí)間在這上面。感謝幫助,Python爬蟲(chóng)動(dòng)態(tài)頁(yè)面爬取問(wèn)題?- 爬蟲(chóng)(計算機網(wǎng)絡(luò )) - 知乎
  瀏覽器中的代碼是用javascript修改的,可以直接用requests打印出來(lái)看看
  

/static/img/blank.gif



  在requests返回的數據中可以看到,“data-lazy”總是收錄我們需要的數據,修改代碼
  
  發(fā)現現在返回的數據就是我們需要的,打開(kāi)圖片查看
  
  
  下圖更清晰,我們只需要將“__340”替換為“_960_720”即可 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(就是爬取小編精選的圖片小編精選-照片(組圖))
  更好的體驗:Python 爬蟲(chóng)在行動(dòng)中 - Pixabay上的免費圖片
  
  Pixie,一個(gè)不錯的高清未經(jīng)審查的圖像網(wǎng)站,可以免費下載。
  /
  一些介紹
  超過(guò) 900,000 張高質(zhì)量的照片、插圖和矢量圖形。免費用于商業(yè)用途。無(wú)需歸屬。
  Pixabay是一個(gè)高質(zhì)量的圖片分享網(wǎng)站。網(wǎng)站 最初是由 Hans Braxmeier 和 Simon Steinberger 在德國開(kāi)發(fā)的。截至 2013 年 2 月,網(wǎng)站 有大約 70,000 張免費照片和矢量圖形,由社區中的電影制作人和插畫(huà)家提供。公司于2010年12月在德國烏爾姆成立。
  2012 年 3 月,Pixabay 開(kāi)始從私人圖片集網(wǎng)站 轉變?yōu)橹С?20 種語(yǔ)言的交互式在線(xiàn)社區 網(wǎng)站。同年5月,網(wǎng)站推出了公共應用編程接口,允許第三方用戶(hù)和網(wǎng)站開(kāi)發(fā)者搜索其圖片庫。網(wǎng)站還與 Flickr、YouTube 和 Wiki 共享資源。
  Pixabay用戶(hù)無(wú)需注冊即可獲得無(wú)版權的高質(zhì)量圖像。根據知識共享合約CC0相關(guān)的肖像權,用戶(hù)通過(guò)在本網(wǎng)站上傳圖片,默認放棄圖片版權,讓圖片得以廣泛傳播。網(wǎng)站允許任何人在未經(jīng)許可和背書(shū)的情況下使用、修改圖像——即使在商業(yè)應用中也是如此。
  為確保Pixabay上的高質(zhì)量圖片標準,用戶(hù)上傳的所有圖片都將由網(wǎng)站工作人員手動(dòng)審批。大約 27% 的用戶(hù)會(huì )說(shuō)英語(yǔ),20% 會(huì )說(shuō)西班牙語(yǔ),11% 會(huì )說(shuō)葡萄牙語(yǔ),7% 會(huì )說(shuō)德語(yǔ),5% 會(huì )說(shuō)法語(yǔ)。它的用戶(hù)主要是博主、平面設計師、作家、記者和廣告商。
  今天的目標是爬取小編的精選圖片小編的精選-圖片
  一、分析
  我們需要編寫(xiě)3個(gè)函數
  A Download(url) 下載圖片
  一個(gè)用于獲取編輯器選擇的FullUrl()總共165頁(yè)
  最后用來(lái)調用main()
  開(kāi)始一一寫(xiě)吧~
  編輯精選 - 照片
  打開(kāi)網(wǎng)頁(yè),F12,查看圖片鏈接所在的標簽
  
  
  你可以看到圖片鏈接都在那里
  標簽下,但是發(fā)現第一張和最后一張圖片的屬性不一樣,提取出來(lái)的
  “src”很好,使用xpath
  import requests
from lxml import etree
header = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36&#39;}
url = &#39;https://pixabay.com/zh/editors_choice/&#39;
r = requests.get(url,headers=header).text
s = etree.HTML(r)
print(s.xpath(&#39;//img/@src&#39;))
  結果發(fā)現
  
  前面是正確的圖片鏈接,后面卻出現'/static/img/blank.gif',這是什么鬼,查看網(wǎng)頁(yè)源代碼,搜索
  
  可以發(fā)現確實(shí)有這個(gè)字符串,我自己也花了很多時(shí)間在這上面。感謝幫助,Python爬蟲(chóng)動(dòng)態(tài)頁(yè)面爬取問(wèn)題?- 爬蟲(chóng)(計算機網(wǎng)絡(luò )) - 知乎
  瀏覽器中的代碼是用javascript修改的,可以直接用requests打印出來(lái)看看
  

/static/img/blank.gif



  在requests返回的數據中可以看到,“data-lazy”總是收錄我們需要的數據,修改代碼
  
  發(fā)現現在返回的數據就是我們需要的,打開(kāi)圖片查看
  
  
  下圖更清晰,我們只需要將“__340”替換為“_960_720”即可

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 72 次瀏覽 ? 2022-02-02 00:16 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞)
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&amp;cl=2&amp;lm=-1&amp;ie=utf-8&amp;oe=utf-8&amp;adpicid=&amp;st=-1&amp;z=&amp;ic=0&amp;word= % E4%BA%8C%E6%AC%A1%E5%85%83&amp;s=&amp;se=&amp;tab=&amp;width=&amp;height=&amp;face=0&amp;istype=2&amp;qc=&amp;nc=1&amp;fr=&amp;pn=60&amp;rn=30&amp;gsm=1000000001e&amp;81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&amp;cl=2&amp;lm=-1&amp;ie=utf-8&amp;oe=utf-8&amp;adpicid=&amp;st=-1&amp;z=&amp;ic=0&amp;word= % E4%BA%8C%E6%AC%A1%E5%85%83&amp;s=&amp;se=&amp;tab=&amp;width=&amp;height=&amp;face=0&amp;istype=2&amp;qc=&amp;nc=1&amp;fr=&amp;pn=60&amp;rn=30&amp;gsm=1000000001e&amp;81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何用Python學(xué)習資料的小伙伴獲取圖片的url? )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-02-01 17:12 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何用Python學(xué)習資料的小伙伴獲取圖片的url?
)
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  1.獲取圖片的url鏈接
  首先,打開(kāi)百度圖片首頁(yè),注意下面url中的索引
  
  接下來(lái),將頁(yè)面切換到傳統的翻頁(yè)版本,因為這樣可以幫助我們抓取圖片!
  
  對比幾個(gè)url,發(fā)現pn參數是請求數。通過(guò)修改pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能收錄60張圖片。
  注意:gsm參數是pn參數的16進(jìn)制表示,去掉就可以了
  
  然后,右鍵查看網(wǎng)頁(yè)源代碼,直接(ctrl+F)搜索objURL
  
  這樣,我們就找到了需要圖片的url了。
  2.將圖片鏈接保存到本地
  現在,我們要做的就是抓取這些信息。
  注意:有objURL、hoverURL...但我們使用objURL是因為這是原圖
  那么,我如何獲取 objURL?使用正則表達式!
  那我們如何用正則表達式來(lái)實(shí)現呢?其實(shí)只需要一行代碼……
  results = re.findall('"objURL":"(.*?)",', html)
  核心代碼:
  1.獲取圖片url代碼:
  # 獲取圖片url連接def get_parse_page(pn,name): for i in range(int(pn)): # 1.獲取網(wǎng)頁(yè) print('正在獲取第{}頁(yè)'.format(i+1)) # 百度圖片首頁(yè)的url # name是你要搜索的關(guān)鍵詞 # pn是你想下載的頁(yè)數 url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%s&pn=%d' %(name,i*20) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400'} # 發(fā)送請求,獲取相應 response = requests.get(url, headers=headers) html = response.content.decode() # print(html) # 2.正則表達式解析網(wǎng)頁(yè) # "objURL":"http://n.sinaimg.cn/sports/tra ... ot%3B results = re.findall('"objURL":"(.*?)",', html) # 返回一個(gè)列表 # 根據獲取到的圖片鏈接,把圖片保存到本地 save_to_txt(results, name, i)
  2.保存圖片到本地代碼:
  # 保存圖片到本地def save_to_txt(results, name, i): j = 0 # 在當目錄下創(chuàng )建文件夾 if not os.path.exists('./' + name): os.makedirs('./' + name) # 下載圖片 for result in results: print('正在保存第{}個(gè)'.format(j)) try: pic = requests.get(result, timeout=10) time.sleep(1) except: print('當前圖片無(wú)法下載') j += 1 continue # 可忽略,這段代碼有bug # file_name = result.split('/') # file_name = file_name[len(file_name) - 1] # print(file_name) # # end = re.search('(.png|.jpg|.jpeg|.gif)$', file_name) # if end == None: # file_name = file_name + '.jpg' # 把圖片保存到文件夾 file_full_name = './' + name + '/' + str(i) + '-' + str(j) + '.jpg' with open(file_full_name, 'wb') as f: f.write(pic.content) j += 1
  3.主要功能代碼:
  # 主函數if __name__ == '__main__': name = input('請輸入你要下載的關(guān)鍵詞:') pn = input('你想下載前幾頁(yè)(1頁(yè)有60張):') get_parse_page(pn, name)
  使用說(shuō)明:
  # 配置以下模塊import requests import reimport osimport time# 1.運行 py源文件# 2.輸入你想搜索的關(guān)鍵詞,比如“柯基”、“泰迪”等# 3.輸入你想下載的頁(yè)數,比如5,那就是下載 5 x 60=300 張圖片 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何用Python學(xué)習資料的小伙伴獲取圖片的url?
)
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  1.獲取圖片的url鏈接
  首先,打開(kāi)百度圖片首頁(yè),注意下面url中的索引
  
  接下來(lái),將頁(yè)面切換到傳統的翻頁(yè)版本,因為這樣可以幫助我們抓取圖片!
  
  對比幾個(gè)url,發(fā)現pn參數是請求數。通過(guò)修改pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能收錄60張圖片。
  注意:gsm參數是pn參數的16進(jìn)制表示,去掉就可以了
  
  然后,右鍵查看網(wǎng)頁(yè)源代碼,直接(ctrl+F)搜索objURL
  
  這樣,我們就找到了需要圖片的url了。
  2.將圖片鏈接保存到本地
  現在,我們要做的就是抓取這些信息。
  注意:有objURL、hoverURL...但我們使用objURL是因為這是原圖
  那么,我如何獲取 objURL?使用正則表達式!
  那我們如何用正則表達式來(lái)實(shí)現呢?其實(shí)只需要一行代碼……
  results = re.findall('"objURL":"(.*?)",', html)
  核心代碼:
  1.獲取圖片url代碼:
  # 獲取圖片url連接def get_parse_page(pn,name): for i in range(int(pn)): # 1.獲取網(wǎng)頁(yè) print('正在獲取第{}頁(yè)'.format(i+1)) # 百度圖片首頁(yè)的url # name是你要搜索的關(guān)鍵詞 # pn是你想下載的頁(yè)數 url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%s&pn=%d' %(name,i*20) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400'} # 發(fā)送請求,獲取相應 response = requests.get(url, headers=headers) html = response.content.decode() # print(html) # 2.正則表達式解析網(wǎng)頁(yè) # "objURL":"http://n.sinaimg.cn/sports/tra ... ot%3B results = re.findall('"objURL":"(.*?)",', html) # 返回一個(gè)列表 # 根據獲取到的圖片鏈接,把圖片保存到本地 save_to_txt(results, name, i)
  2.保存圖片到本地代碼:
  # 保存圖片到本地def save_to_txt(results, name, i): j = 0 # 在當目錄下創(chuàng )建文件夾 if not os.path.exists('./' + name): os.makedirs('./' + name) # 下載圖片 for result in results: print('正在保存第{}個(gè)'.format(j)) try: pic = requests.get(result, timeout=10) time.sleep(1) except: print('當前圖片無(wú)法下載') j += 1 continue # 可忽略,這段代碼有bug # file_name = result.split('/') # file_name = file_name[len(file_name) - 1] # print(file_name) # # end = re.search('(.png|.jpg|.jpeg|.gif)$', file_name) # if end == None: # file_name = file_name + '.jpg' # 把圖片保存到文件夾 file_full_name = './' + name + '/' + str(i) + '-' + str(j) + '.jpg' with open(file_full_name, 'wb') as f: f.write(pic.content) j += 1
  3.主要功能代碼:
  # 主函數if __name__ == '__main__': name = input('請輸入你要下載的關(guān)鍵詞:') pn = input('你想下載前幾頁(yè)(1頁(yè)有60張):') get_parse_page(pn, name)
  使用說(shuō)明:
  # 配置以下模塊import requests import reimport osimport time# 1.運行 py源文件# 2.輸入你想搜索的關(guān)鍵詞,比如“柯基”、“泰迪”等# 3.輸入你想下載的頁(yè)數,比如5,那就是下載 5 x 60=300 張圖片

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(模擬瀏覽器打開(kāi)網(wǎng)頁(yè)的時(shí)候一般操作:打開(kāi)同類(lèi)壁紙)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 59 次瀏覽 ? 2022-01-30 18:00 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(模擬瀏覽器打開(kāi)網(wǎng)頁(yè)的時(shí)候一般操作:打開(kāi)同類(lèi)壁紙)
  前言
  在設計爬蟲(chóng)項目時(shí),首先要明確手動(dòng)瀏覽頁(yè)面獲取圖片時(shí)腦海中的步驟
  一般來(lái)說(shuō),我們上網(wǎng)批量打開(kāi)壁紙時(shí),一般操作如下:
  1、打開(kāi)壁紙頁(yè)面
  2、點(diǎn)擊壁紙圖片(打開(kāi)指定壁紙的頁(yè)面)
  3、選擇分辨率(我們要下載高分辨率圖片)
  4、保存圖片
  在實(shí)際操作中,我們實(shí)現了以下步驟訪(fǎng)問(wèn)網(wǎng)頁(yè)地址:打開(kāi)帶有壁紙的網(wǎng)頁(yè)→點(diǎn)擊壁紙圖片打開(kāi)指定頁(yè)面→選擇分辨率,點(diǎn)擊打開(kāi)最終保存目標圖片網(wǎng)頁(yè)→保存圖片
  在爬取過(guò)程中,我們嘗試通過(guò)模擬瀏覽器的操作打開(kāi)網(wǎng)頁(yè),一步一步獲取并訪(fǎng)問(wèn)該網(wǎng)頁(yè),最終獲取目標圖片的下載地址,下載圖片并保存到指定路徑
  *在這些中間過(guò)程中構建網(wǎng)頁(yè)的一些特定過(guò)濾條件,需要打開(kāi)指定頁(yè)面的源代碼,觀(guān)察并找到收錄有目的鏈接的標簽
  具體實(shí)施事項及注意事項
  這里只是想獲取一些指定的圖片,所以先在網(wǎng)頁(yè)上搜索“長(cháng)門(mén)由?!?,打開(kāi)一個(gè)搜索結果頁(yè)面,發(fā)現這個(gè)頁(yè)面已經(jīng)收錄了其他同類(lèi)型的壁紙鏈接,于是開(kāi)始設置本次搜索結果頁(yè)初次訪(fǎng)問(wèn)的目的地址
  目標結果頁(yè)面截圖:
  圖中下標為“1/29”?!?/29”是同類(lèi)型的其他目標壁紙。通過(guò)點(diǎn)擊這些圖片,我們可以打開(kāi)新的目標下載圖片頁(yè)面
  下面我們來(lái)看網(wǎng)頁(yè)的源代碼
  圖中黃底的地方就是打開(kāi)這些類(lèi)似壁紙的目的地址(訪(fǎng)問(wèn)時(shí)需要加前綴“”)
  現在我們可以嘗試構建爬蟲(chóng):
  打開(kāi)指定頁(yè)面→過(guò)濾獲取所有長(cháng)門(mén)由紀壁紙的目標下載頁(yè)面鏈接
  代碼顯示如下:
  獲取地址后,我們可以獲取地址→打開(kāi)指定頁(yè)面→選擇分辨率→獲取目標下載地址→保存到本地指定路徑
  測試時(shí),我輸出了上一步保存在truelist中的內容
  
  可以看到保存的只是一個(gè)后綴,我們需要在訪(fǎng)問(wèn)的時(shí)候加上一個(gè)指定的前綴
  實(shí)現代碼如下(注釋見(jiàn)代碼):
  終于可以在你的目標文件夾中看到爬下來(lái)的那組圖片了~
  轉載于: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(模擬瀏覽器打開(kāi)網(wǎng)頁(yè)的時(shí)候一般操作:打開(kāi)同類(lèi)壁紙)
  前言
  在設計爬蟲(chóng)項目時(shí),首先要明確手動(dòng)瀏覽頁(yè)面獲取圖片時(shí)腦海中的步驟
  一般來(lái)說(shuō),我們上網(wǎng)批量打開(kāi)壁紙時(shí),一般操作如下:
  1、打開(kāi)壁紙頁(yè)面
  2、點(diǎn)擊壁紙圖片(打開(kāi)指定壁紙的頁(yè)面)
  3、選擇分辨率(我們要下載高分辨率圖片)
  4、保存圖片
  在實(shí)際操作中,我們實(shí)現了以下步驟訪(fǎng)問(wèn)網(wǎng)頁(yè)地址:打開(kāi)帶有壁紙的網(wǎng)頁(yè)→點(diǎn)擊壁紙圖片打開(kāi)指定頁(yè)面→選擇分辨率,點(diǎn)擊打開(kāi)最終保存目標圖片網(wǎng)頁(yè)→保存圖片
  在爬取過(guò)程中,我們嘗試通過(guò)模擬瀏覽器的操作打開(kāi)網(wǎng)頁(yè),一步一步獲取并訪(fǎng)問(wèn)該網(wǎng)頁(yè),最終獲取目標圖片的下載地址,下載圖片并保存到指定路徑
  *在這些中間過(guò)程中構建網(wǎng)頁(yè)的一些特定過(guò)濾條件,需要打開(kāi)指定頁(yè)面的源代碼,觀(guān)察并找到收錄有目的鏈接的標簽
  具體實(shí)施事項及注意事項
  這里只是想獲取一些指定的圖片,所以先在網(wǎng)頁(yè)上搜索“長(cháng)門(mén)由?!?,打開(kāi)一個(gè)搜索結果頁(yè)面,發(fā)現這個(gè)頁(yè)面已經(jīng)收錄了其他同類(lèi)型的壁紙鏈接,于是開(kāi)始設置本次搜索結果頁(yè)初次訪(fǎng)問(wèn)的目的地址
  目標結果頁(yè)面截圖:
  圖中下標為“1/29”?!?/29”是同類(lèi)型的其他目標壁紙。通過(guò)點(diǎn)擊這些圖片,我們可以打開(kāi)新的目標下載圖片頁(yè)面
  下面我們來(lái)看網(wǎng)頁(yè)的源代碼
  圖中黃底的地方就是打開(kāi)這些類(lèi)似壁紙的目的地址(訪(fǎng)問(wèn)時(shí)需要加前綴“”)
  現在我們可以嘗試構建爬蟲(chóng):
  打開(kāi)指定頁(yè)面→過(guò)濾獲取所有長(cháng)門(mén)由紀壁紙的目標下載頁(yè)面鏈接
  代碼顯示如下:
  獲取地址后,我們可以獲取地址→打開(kāi)指定頁(yè)面→選擇分辨率→獲取目標下載地址→保存到本地指定路徑
  測試時(shí),我輸出了上一步保存在truelist中的內容
  
  可以看到保存的只是一個(gè)后綴,我們需要在訪(fǎng)問(wèn)的時(shí)候加上一個(gè)指定的前綴
  實(shí)現代碼如下(注釋見(jiàn)代碼):
  終于可以在你的目標文件夾中看到爬下來(lái)的那組圖片了~
  轉載于:

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(連游戲都沒(méi)法玩3臺電腦一般是想只用python程序運行嗎)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 61 次瀏覽 ? 2022-01-30 09:11 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(連游戲都沒(méi)法玩3臺電腦一般是想只用python程序運行嗎)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片、爬蟲(chóng)抓取糗百、爬蟲(chóng)抓取ebay等美劇網(wǎng)頁(yè)網(wǎng)頁(yè)爬蟲(chóng)抓取知乎等。
  python大法好
  我們公司一直用通用爬蟲(chóng)+python的解決方案,采購的電腦一臺cpu8核心15線(xiàn)程,主頻2.7ghz的,兩個(gè)服務(wù)器,加起來(lái)三千多。
  連游戲都沒(méi)法玩
  3臺電腦一般是軟路由啊
  同一個(gè)電腦同時(shí)開(kāi)機游戲就打不了了
  提主是想只用python程序運行嗎?我們公司專(zhuān)門(mén)有兩臺esxi交換機,一臺做服務(wù)器,一臺做內網(wǎng)ip,web系統用的nginx,負載均衡用docker(輪詢(xún),slb),全部用python來(lái)寫(xiě),沒(méi)問(wèn)題,前提是不同的系統不要影響同一個(gè)程序正常運行。要是想只用python來(lái)寫(xiě)程序,那我建議用pypy吧,可以在同一個(gè)程序上打到linux系統中。
  以上所有操作都可以通過(guò)gateway配置來(lái)實(shí)現,只需要改變loadlibrarylistener到pypy即可。
  iphone4
  一臺windows一臺mac
  redhat,gentoo,linux系統有自己的內核來(lái)支持虛擬化,windows虛擬化不是很好,中國特色吧。
  玩游戲還是玩python吧,這個(gè)沒(méi)的說(shuō)。
  同時(shí)開(kāi)200臺電腦都不卡!開(kāi)個(gè)網(wǎng)頁(yè)嗖嗖的,服務(wù)器性能肯定夠。如果是做網(wǎng)頁(yè)爬蟲(chóng),本地沒(méi)有能跑python的環(huán)境,建議用阿里云ecs,給新客戶(hù)送的那個(gè),有物理隔離。如果只是單純的用python爬數據,建議只用mysql,其他的也沒(méi)啥可以折騰的。另外解決網(wǎng)絡(luò )問(wèn)題,一臺主機上windows還有nginxlvssocks5mapredisapache等都安裝好才是最重要的,穩定運行用linux最好,或者干脆windowsserver也行。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(連游戲都沒(méi)法玩3臺電腦一般是想只用python程序運行嗎)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片、爬蟲(chóng)抓取糗百、爬蟲(chóng)抓取ebay等美劇網(wǎng)頁(yè)網(wǎng)頁(yè)爬蟲(chóng)抓取知乎等。
  python大法好
  我們公司一直用通用爬蟲(chóng)+python的解決方案,采購的電腦一臺cpu8核心15線(xiàn)程,主頻2.7ghz的,兩個(gè)服務(wù)器,加起來(lái)三千多。
  連游戲都沒(méi)法玩
  3臺電腦一般是軟路由啊
  同一個(gè)電腦同時(shí)開(kāi)機游戲就打不了了
  提主是想只用python程序運行嗎?我們公司專(zhuān)門(mén)有兩臺esxi交換機,一臺做服務(wù)器,一臺做內網(wǎng)ip,web系統用的nginx,負載均衡用docker(輪詢(xún),slb),全部用python來(lái)寫(xiě),沒(méi)問(wèn)題,前提是不同的系統不要影響同一個(gè)程序正常運行。要是想只用python來(lái)寫(xiě)程序,那我建議用pypy吧,可以在同一個(gè)程序上打到linux系統中。
  以上所有操作都可以通過(guò)gateway配置來(lái)實(shí)現,只需要改變loadlibrarylistener到pypy即可。
  iphone4
  一臺windows一臺mac
  redhat,gentoo,linux系統有自己的內核來(lái)支持虛擬化,windows虛擬化不是很好,中國特色吧。
  玩游戲還是玩python吧,這個(gè)沒(méi)的說(shuō)。
  同時(shí)開(kāi)200臺電腦都不卡!開(kāi)個(gè)網(wǎng)頁(yè)嗖嗖的,服務(wù)器性能肯定夠。如果是做網(wǎng)頁(yè)爬蟲(chóng),本地沒(méi)有能跑python的環(huán)境,建議用阿里云ecs,給新客戶(hù)送的那個(gè),有物理隔離。如果只是單純的用python爬數據,建議只用mysql,其他的也沒(méi)啥可以折騰的。另外解決網(wǎng)絡(luò )問(wèn)題,一臺主機上windows還有nginxlvssocks5mapredisapache等都安裝好才是最重要的,穩定運行用linux最好,或者干脆windowsserver也行。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(url向百度發(fā)送請求import#需要用這個(gè)包進(jìn)行正則匹配import)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-01-29 22:13 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(url向百度發(fā)送請求import#需要用這個(gè)包進(jìn)行正則匹配import)
  宣布
  此文章僅供學(xué)習使用,如果讀者利用此方法進(jìn)行違法犯罪活動(dòng),與本人無(wú)關(guān)。
  爬蟲(chóng)已經(jīng)觸犯了法律,因此需要謹慎使用。
  下面開(kāi)始文字
  一、導入幾個(gè)需要用到的包
  import requests #需要使用這個(gè)包向百度發(fā)送請求
  import re #需要使用這個(gè)包進(jìn)行正則匹配
  import time #Sleep 避免對服務(wù)器造成太大壓力
  這里的requests主要作用是向百度發(fā)送請求,也就是模仿人工操作進(jìn)行訪(fǎng)問(wèn)。有兩種方法:post 和 get。這里我們使用get方法。
  然后,開(kāi)始向百度發(fā)送請求。當然,你需要一個(gè)百度圖片的鏈接。首先,訪(fǎng)問(wèn)百度的圖片,看看鏈接是什么樣子的。
  url 列如下所示:
  皮卡丘
  去掉一些不必要的內容后,可以長(cháng)成這樣
  皮卡丘
  如果你不相信我,你可以試試。
  然后分析url,前者肯定是固定格式,不能更改,而后者word=Pikachu顯然就是我們搜索的關(guān)鍵詞。url就解決了,然后向百度發(fā)送請求。代碼顯示如下:
  html = requests.get(url)
  html.encoding = html.apparent_encoding #這里可以查看需要爬取的頁(yè)面的源碼,一般是utf-8,但不是全部。
  html = html.text #這里需要獲取對應的文本,用于后面的正則匹配操作
  接下來(lái)就是操作源碼了。最好對網(wǎng)絡(luò )前端有所了解。如果沒(méi)有,至少檢查一下源碼(最簡(jiǎn)單的操作是在網(wǎng)址欄前面加上view-source)
  一、在源頁(yè)面搜索jpg(百度圖片后綴,先找到圖片鏈接)
  只需抓取一個(gè)鏈接并分析它:
  {"ObjURL":"http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg","ObjUrl":"http:\/\/\/forum\/pic\ /項目\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg"
  抓取http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg里面,訪(fǎng)問(wèn)一下,發(fā)現是可以訪(fǎng)問(wèn)的。又試了幾次,發(fā)現只有objURL開(kāi)頭的可以訪(fǎng)問(wèn),而objURL開(kāi)頭的可能無(wú)法訪(fǎng)問(wèn)。沒(méi)關(guān)系,先把所有的
  "ObjURL":"xxxx"
  格式中的所有鏈接都找到了,這時(shí)候就需要使用正則匹配了。代碼顯示如下:
  urls = re.findall('"objURL":"(.*?)"',html,re.S) #這里使用導入的re包
  需要注意的是,re.findall匹配的數據是一個(gè)列表,需要用for循環(huán)逐個(gè)訪(fǎng)問(wèn):
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  一個(gè)最簡(jiǎn)單的爬蟲(chóng)已經(jīng)寫(xiě)好了,但是如果有一點(diǎn)錯誤就會(huì )報錯。沒(méi)有所謂的魯棒性。如何改進(jìn)爬蟲(chóng)將在下一篇文章文章中解釋。
  完整代碼如下,大家可以自己體驗一下:
  導入請求
  重新進(jìn)口
  進(jìn)口時(shí)間
  url = '皮卡丘'
  html = requests.get(url)
  html.encoding = html.apparent_encoding
  html = html.text
  urls = re.findall('"objURL":"(.*?)"',html,re.S)
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  注:最后給大家發(fā)一套2020年最新的企業(yè)級Python項目實(shí)戰視頻教程,點(diǎn)此領(lǐng)取,跟著(zhù)實(shí)踐。希望大家一起進(jìn)步! 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(url向百度發(fā)送請求import#需要用這個(gè)包進(jìn)行正則匹配import)
  宣布
  此文章僅供學(xué)習使用,如果讀者利用此方法進(jìn)行違法犯罪活動(dòng),與本人無(wú)關(guān)。
  爬蟲(chóng)已經(jīng)觸犯了法律,因此需要謹慎使用。
  下面開(kāi)始文字
  一、導入幾個(gè)需要用到的包
  import requests #需要使用這個(gè)包向百度發(fā)送請求
  import re #需要使用這個(gè)包進(jìn)行正則匹配
  import time #Sleep 避免對服務(wù)器造成太大壓力
  這里的requests主要作用是向百度發(fā)送請求,也就是模仿人工操作進(jìn)行訪(fǎng)問(wèn)。有兩種方法:post 和 get。這里我們使用get方法。
  然后,開(kāi)始向百度發(fā)送請求。當然,你需要一個(gè)百度圖片的鏈接。首先,訪(fǎng)問(wèn)百度的圖片,看看鏈接是什么樣子的。
  url 列如下所示:
  皮卡丘
  去掉一些不必要的內容后,可以長(cháng)成這樣
  皮卡丘
  如果你不相信我,你可以試試。
  然后分析url,前者肯定是固定格式,不能更改,而后者word=Pikachu顯然就是我們搜索的關(guān)鍵詞。url就解決了,然后向百度發(fā)送請求。代碼顯示如下:
  html = requests.get(url)
  html.encoding = html.apparent_encoding #這里可以查看需要爬取的頁(yè)面的源碼,一般是utf-8,但不是全部。
  html = html.text #這里需要獲取對應的文本,用于后面的正則匹配操作
  接下來(lái)就是操作源碼了。最好對網(wǎng)絡(luò )前端有所了解。如果沒(méi)有,至少檢查一下源碼(最簡(jiǎn)單的操作是在網(wǎng)址欄前面加上view-source)
  一、在源頁(yè)面搜索jpg(百度圖片后綴,先找到圖片鏈接)
  只需抓取一個(gè)鏈接并分析它:
  {"ObjURL":"http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg","ObjUrl":"http:\/\/\/forum\/pic\ /項目\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg"
  抓取http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg里面,訪(fǎng)問(wèn)一下,發(fā)現是可以訪(fǎng)問(wèn)的。又試了幾次,發(fā)現只有objURL開(kāi)頭的可以訪(fǎng)問(wèn),而objURL開(kāi)頭的可能無(wú)法訪(fǎng)問(wèn)。沒(méi)關(guān)系,先把所有的
  "ObjURL":"xxxx"
  格式中的所有鏈接都找到了,這時(shí)候就需要使用正則匹配了。代碼顯示如下:
  urls = re.findall('"objURL":"(.*?)"',html,re.S) #這里使用導入的re包
  需要注意的是,re.findall匹配的數據是一個(gè)列表,需要用for循環(huán)逐個(gè)訪(fǎng)問(wèn):
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  一個(gè)最簡(jiǎn)單的爬蟲(chóng)已經(jīng)寫(xiě)好了,但是如果有一點(diǎn)錯誤就會(huì )報錯。沒(méi)有所謂的魯棒性。如何改進(jìn)爬蟲(chóng)將在下一篇文章文章中解釋。
  完整代碼如下,大家可以自己體驗一下:
  導入請求
  重新進(jìn)口
  進(jìn)口時(shí)間
  url = '皮卡丘'
  html = requests.get(url)
  html.encoding = html.apparent_encoding
  html = html.text
  urls = re.findall('"objURL":"(.*?)"',html,re.S)
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  注:最后給大家發(fā)一套2020年最新的企業(yè)級Python項目實(shí)戰視頻教程,點(diǎn)此領(lǐng)取,跟著(zhù)實(shí)踐。希望大家一起進(jìn)步!

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(要求:爬取30張百度圖片中關(guān)曉彤的照片??! )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-01-29 22:11 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(要求:爬取30張百度圖片中關(guān)曉彤的照片??!
)
  要求:在百度圖片中抓取關(guān)曉彤的30張照片! ! !首先,遵循一個(gè)爬蟲(chóng)的大致開(kāi)發(fā)流程:
  
  (1)分析網(wǎng)頁(yè):由于網(wǎng)頁(yè)的源代碼太復雜,想要找到我們想要的太難了,所以隨便找一張圖片的url,操作是如下:
  
  然后,查看網(wǎng)頁(yè)的源碼,ctrl+f搜索剛剛找到的圖片的url,會(huì )找到三個(gè),我們以第一個(gè)為例:
  
  #觀(guān)察前面有一個(gè)thumbURL,我們在這個(gè)源碼中搜索:
  
  如你所見(jiàn),我們只需要借用 thumbURL 來(lái)使用正則表達式來(lái)匹配每張圖片的 url。 (2)代碼編寫(xiě):
  #1.找目標數據
#2.分析請求流程 (1)每個(gè)關(guān)曉彤照片就是一個(gè)url (2)拿到這些url (3)會(huì )發(fā)現有30個(gè)thumbURL 這就剛好對應30個(gè)關(guān)曉彤照片的url(這些都在page_url里)
import urllib3
import re
import os
http = urllib3.PoolManager()
# 第一部分:獲取包含這些圖片的網(wǎng)頁(yè)的代碼
page_url = "https://image.baidu.com/search ... ot%3B
res = http.request("GET",page_url)
html = res.data.decode()
# print(html)
# 第二部分:利用正則鎖定我們所要爬取的圖片的url
img_urls = re.findall('thumbURL":"(.*?)"',html)
print(img_urls)
# 將圖片扔到文件夾里
if not os.path.exists("girl_imgs"):
os.mkdir("girl_imgs")
# 遍歷對每個(gè)圖片url發(fā)起請求
for index,img_url in enumerate(img_urls):
res=http.request("GET",img_url)
img_data=res.data
filename="girl_imgs/"+str(index)+".jpg"
with open(filename,"wb") as f:
f.write(img_data)
  注意:如果不能爬取,會(huì )被封禁。發(fā)送請求時(shí)添加標頭。如果只在header中添加user-agent,報錯,添加referer(熱鏈)!
  
   查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(要求:爬取30張百度圖片中關(guān)曉彤的照片??!
)
  要求:在百度圖片中抓取關(guān)曉彤的30張照片! ! !首先,遵循一個(gè)爬蟲(chóng)的大致開(kāi)發(fā)流程:
  
  (1)分析網(wǎng)頁(yè):由于網(wǎng)頁(yè)的源代碼太復雜,想要找到我們想要的太難了,所以隨便找一張圖片的url,操作是如下:
  
  然后,查看網(wǎng)頁(yè)的源碼,ctrl+f搜索剛剛找到的圖片的url,會(huì )找到三個(gè),我們以第一個(gè)為例:
  
  #觀(guān)察前面有一個(gè)thumbURL,我們在這個(gè)源碼中搜索:
  
  如你所見(jiàn),我們只需要借用 thumbURL 來(lái)使用正則表達式來(lái)匹配每張圖片的 url。 (2)代碼編寫(xiě):
  #1.找目標數據
#2.分析請求流程 (1)每個(gè)關(guān)曉彤照片就是一個(gè)url (2)拿到這些url (3)會(huì )發(fā)現有30個(gè)thumbURL 這就剛好對應30個(gè)關(guān)曉彤照片的url(這些都在page_url里)
import urllib3
import re
import os
http = urllib3.PoolManager()
# 第一部分:獲取包含這些圖片的網(wǎng)頁(yè)的代碼
page_url = "https://image.baidu.com/search ... ot%3B
res = http.request("GET",page_url)
html = res.data.decode()
# print(html)
# 第二部分:利用正則鎖定我們所要爬取的圖片的url
img_urls = re.findall('thumbURL":"(.*?)"',html)
print(img_urls)
# 將圖片扔到文件夾里
if not os.path.exists("girl_imgs"):
os.mkdir("girl_imgs")
# 遍歷對每個(gè)圖片url發(fā)起請求
for index,img_url in enumerate(img_urls):
res=http.request("GET",img_url)
img_data=res.data
filename="girl_imgs/"+str(index)+".jpg"
with open(filename,"wb") as f:
f.write(img_data)
  注意:如果不能爬取,會(huì )被封禁。發(fā)送請求時(shí)添加標頭。如果只在header中添加user-agent,報錯,添加referer(熱鏈)!
  
  

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重?t)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 54 次瀏覽 ? 2022-01-29 12:06 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重?t)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重。爬蟲(chóng)基礎架構是httpget請求。這里需要在指定的url下去重。要知道,requestheader字段在這個(gè)過(guò)程中會(huì )被逐個(gè)嘗試,acceptlanguageauthorizationcontext這幾項下面是一些常見(jiàn)的做法。http請求逐個(gè)嘗試有幾個(gè)比較方便的做法:tcp抽取數據v1.0:socket編程基礎googlehttprequest抽取文件http文件直接傳輸200,201,213之類(lèi)的。
  需要提前想好接收的url名稱(chēng)和文件名。http文件獲取googlehttprequest抽取bulk數據bulk方式的有兩種:url后綴或者/。這里教大家一個(gè)python基礎里的重載get方法基礎知識,考驗的不是使用get方法取數據,而是獲取attribute字段的字典:classme(http.get):def__init__(self,salary,b...):self.salary=salaryself.b=bself.preload=false...通過(guò)這個(gè)例子,希望你知道request請求的response屬性里面的salary和b,如何去理解。
  第一次和后續的爬蟲(chóng)代碼基礎爬蟲(chóng)代碼基礎,注意把make_auth,forwardedheader和user_agent這三個(gè)參數寫(xiě)好。我一般都用后綴名.string形式。ps:我自己用urllib.request庫爬微博博客爬取文章過(guò)程中發(fā)現,網(wǎng)頁(yè)很多都是重復的,很久前的。于是,我把request請求的頭部信息拆解,寫(xiě)成了函數。
  下面是一個(gè)python的程序,都在python庫中實(shí)現。#!/usr/bin/envpython#-*-coding:utf-8-*-fromcollectionsimportordereddictfromseleniumimportwebdriverfromdatetimeimportdatetimefromflaskimportflaskdefget_auth(url,headers):returnhttp.session().get(url).select(headers=headers)defget_header(url,headers):returnhttp.session().get(url).select(headers=headers)if__name__=='__main__':urls=[微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersdatetime=datetime.now()ifsys.argv[1]=='':print(sys.argv[1])returnhttp.session().get(url,headers=headers)if__name__=='__main__':client=collections.ordereddict()p_url=['''微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersif__name__=='__main__':urls=['微博博客爬取bulkdata'''。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重?t)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重。爬蟲(chóng)基礎架構是httpget請求。這里需要在指定的url下去重。要知道,requestheader字段在這個(gè)過(guò)程中會(huì )被逐個(gè)嘗試,acceptlanguageauthorizationcontext這幾項下面是一些常見(jiàn)的做法。http請求逐個(gè)嘗試有幾個(gè)比較方便的做法:tcp抽取數據v1.0:socket編程基礎googlehttprequest抽取文件http文件直接傳輸200,201,213之類(lèi)的。
  需要提前想好接收的url名稱(chēng)和文件名。http文件獲取googlehttprequest抽取bulk數據bulk方式的有兩種:url后綴或者/。這里教大家一個(gè)python基礎里的重載get方法基礎知識,考驗的不是使用get方法取數據,而是獲取attribute字段的字典:classme(http.get):def__init__(self,salary,b...):self.salary=salaryself.b=bself.preload=false...通過(guò)這個(gè)例子,希望你知道request請求的response屬性里面的salary和b,如何去理解。
  第一次和后續的爬蟲(chóng)代碼基礎爬蟲(chóng)代碼基礎,注意把make_auth,forwardedheader和user_agent這三個(gè)參數寫(xiě)好。我一般都用后綴名.string形式。ps:我自己用urllib.request庫爬微博博客爬取文章過(guò)程中發(fā)現,網(wǎng)頁(yè)很多都是重復的,很久前的。于是,我把request請求的頭部信息拆解,寫(xiě)成了函數。
  下面是一個(gè)python的程序,都在python庫中實(shí)現。#!/usr/bin/envpython#-*-coding:utf-8-*-fromcollectionsimportordereddictfromseleniumimportwebdriverfromdatetimeimportdatetimefromflaskimportflaskdefget_auth(url,headers):returnhttp.session().get(url).select(headers=headers)defget_header(url,headers):returnhttp.session().get(url).select(headers=headers)if__name__=='__main__':urls=[微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersdatetime=datetime.now()ifsys.argv[1]=='':print(sys.argv[1])returnhttp.session().get(url,headers=headers)if__name__=='__main__':client=collections.ordereddict()p_url=['''微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersif__name__=='__main__':urls=['微博博客爬取bulkdata'''。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(利用python抓取網(wǎng)絡(luò )圖片的步驟:1.根據給定的網(wǎng)址獲取)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 75 次瀏覽 ? 2022-01-28 18:07 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(利用python抓取網(wǎng)絡(luò )圖片的步驟:1.根據給定的網(wǎng)址獲取)
  使用python抓取網(wǎng)絡(luò )圖片的步驟:
  1.根據給定的URL獲取網(wǎng)頁(yè)的源代碼
  2.使用正則表達式過(guò)濾掉源碼中的圖片地址
  3.根據過(guò)濾后的圖片地址下載網(wǎng)絡(luò )圖片
  #coding=UTF-8
import urllib2
import urllib
import re
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getJpg(html):
reg = r&#39;"largeTnImageUrl":"(.+?\.jpg)",&#39;
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
print imgurl
#urllib.urlretrieve(imgurl, &#39;D:/test/%s.html&#39; % x)
header = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11&#39;,
&#39;Accept&#39;:&#39;text/html;q=0.9,*/*;q=0.8&#39;,
&#39;Accept-Charset&#39;:&#39;ISO-8859-1,utf-8;q=0.7,*;q=0.3&#39;,
&#39;Accept-Encoding&#39;:&#39;gzip&#39;,
&#39;Connection&#39;:&#39;close&#39;,
&#39;Referer&#39;:&#39;http://image.baidu.com/i%3Ftn% ... 39%3B
}
timeout = 30
request = urllib2.Request(imgurl,None,header)
response = urllib2.urlopen(request,None,timeout)
str = response.read()
foo = open("D:/test/%s.gif" % x,"wb")
foo.write(str)
foo.close()
x += 1

html = getHtml(&#39;http://image.baidu.com/i%3Ftn% ... %2339;)
print getJpg(html)
  博客示例參考:
  在參考博客實(shí)現示例的過(guò)程中,我也遇到了一些問(wèn)題。圖片已下載,但無(wú)法預覽。經(jīng)過(guò)多次分析,發(fā)現百度圖片設置了反爬。為了解決這個(gè)問(wèn)題,我參考了另一篇博文。
  模擬瀏覽器發(fā)送請求并欺騙服務(wù)器進(jìn)行反爬: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(利用python抓取網(wǎng)絡(luò )圖片的步驟:1.根據給定的網(wǎng)址獲取)
  使用python抓取網(wǎng)絡(luò )圖片的步驟:
  1.根據給定的URL獲取網(wǎng)頁(yè)的源代碼
  2.使用正則表達式過(guò)濾掉源碼中的圖片地址
  3.根據過(guò)濾后的圖片地址下載網(wǎng)絡(luò )圖片
  #coding=UTF-8
import urllib2
import urllib
import re
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getJpg(html):
reg = r&#39;"largeTnImageUrl":"(.+?\.jpg)",&#39;
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
print imgurl
#urllib.urlretrieve(imgurl, &#39;D:/test/%s.html&#39; % x)
header = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11&#39;,
&#39;Accept&#39;:&#39;text/html;q=0.9,*/*;q=0.8&#39;,
&#39;Accept-Charset&#39;:&#39;ISO-8859-1,utf-8;q=0.7,*;q=0.3&#39;,
&#39;Accept-Encoding&#39;:&#39;gzip&#39;,
&#39;Connection&#39;:&#39;close&#39;,
&#39;Referer&#39;:&#39;http://image.baidu.com/i%3Ftn% ... 39%3B
}
timeout = 30
request = urllib2.Request(imgurl,None,header)
response = urllib2.urlopen(request,None,timeout)
str = response.read()
foo = open("D:/test/%s.gif" % x,"wb")
foo.write(str)
foo.close()
x += 1

html = getHtml(&#39;http://image.baidu.com/i%3Ftn% ... %2339;)
print getJpg(html)
  博客示例參考:
  在參考博客實(shí)現示例的過(guò)程中,我也遇到了一些問(wèn)題。圖片已下載,但無(wú)法預覽。經(jīng)過(guò)多次分析,發(fā)現百度圖片設置了反爬。為了解決這個(gè)問(wèn)題,我參考了另一篇博文。
  模擬瀏覽器發(fā)送請求并欺騙服務(wù)器進(jìn)行反爬:

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 62 次瀏覽 ? 2022-02-07 07:14 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞)
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&amp;cl=2&amp;lm=-1&amp;ie=utf-8&amp;oe=utf-8&amp;adpicid=&amp;st=-1&amp;z=&amp;ic=0&amp;word= % E4%BA%8C%E6%AC%A1%E5%85%83&amp;s=&amp;se=&amp;tab=&amp;width=&amp;height=&amp;face=0&amp;istype=2&amp;qc=&amp;nc=1&amp;fr=&amp;pn=60&amp;rn=30&amp;gsm=1000000001e&amp;81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是已經(jīng)請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&amp;cl=2&amp;lm=-1&amp;ie=utf-8&amp;oe=utf-8&amp;adpicid=&amp;st=-1&amp;z=&amp;ic=0&amp;word= % E4%BA%8C%E6%AC%A1%E5%85%83&amp;s=&amp;se=&amp;tab=&amp;width=&amp;height=&amp;face=0&amp;istype=2&amp;qc=&amp;nc=1&amp;fr=&amp;pn=60&amp;rn=30&amp;gsm=1000000001e&amp;81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是已經(jīng)請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(一張前端與反爬蟲(chóng)這一的區別)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 274 次瀏覽 ? 2022-02-06 21:23 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(一張前端與反爬蟲(chóng)這一的區別)
  [目錄](méi)
  1. 前言
  對于一個(gè)網(wǎng)頁(yè),我們往往希望它結構合理,內容清晰,以便搜索引擎能夠準確識別。另一方面,還有一些我們不希望內容被輕易獲取的場(chǎng)景,比如電商的交易量網(wǎng)站、教育話(huà)題網(wǎng)站等。因為這些內容往往是產(chǎn)品的命脈,必須得到有效保護。這就是爬行動(dòng)物和反爬行動(dòng)物的話(huà)題的由來(lái)。爬取圖片的整體操作流程可以分為三個(gè)步驟:
  獲取頁(yè)面信息 讀取圖片鏈接并將圖片保存在本地指定目錄
  2. 常見(jiàn)的反爬蟲(chóng)策略
  但是世界上沒(méi)有可以完美反爬蟲(chóng)的網(wǎng)站。
  如果頁(yè)面想要在不給爬蟲(chóng)機會(huì )的情況下正常顯示在用戶(hù)面前,它必須能夠識別真人和機器人。因此,工程師們進(jìn)行了各種嘗試。這些策略大多用在后端,也是目前比較常規有效的手段,比如:
  而爬行動(dòng)物可以無(wú)限接近真人,比如:
  所以我們說(shuō),100% 反爬策略?不存在的。這更像是一種體力活動(dòng),這是一個(gè)困難的問(wèn)題。
  不過(guò)作為前端工程師,我們可以增加游戲的難度,設計一些非常(sang)有意義(bing)思維(kuang)**的反爬蟲(chóng)策略。
  3.前端和反爬蟲(chóng)3.1 FONT-FACE拼湊
  示例:貓眼電影
  在貓眼電影中,票房數據并不是純粹的數字。頁(yè)面使用font-face定義字符集,使用unicode映射顯示。也就是說(shuō),除了圖像識別,還要同時(shí)爬取字符集才能識別數字。
  而且,每次頁(yè)面刷新,字符集的url都會(huì )發(fā)生變化,這無(wú)疑增加了爬取成本,難度更大。
  3.2 背景拼湊
  例子:
  與字體的策略類(lèi)似,美團使用背景拼湊。數字實(shí)際上是圖片,根據不同的背景偏移量顯示不同的字符。
  而不同的頁(yè)面,圖片的字符排序也不同。但是理論上只需要生成0-9和一個(gè)小數點(diǎn),所以不明白為什么會(huì )有重復的字符。
  3.3 個(gè)字符穿插
  示例:微信公眾號文章
  一些微信公眾號的文章中穿插著(zhù)各種神秘的人物,這些人物都是通過(guò)樣式隱藏起來(lái)的。這種方法雖然令人震驚……但其實(shí)識別過(guò)濾也不是太難,甚至可以做得更好,但也是一種腦洞。
  3.4 偽元素隱藏
  示例:汽車(chē)主頁(yè)
  汽車(chē)之家,關(guān)鍵制造商信息被放入偽元素的內容中。這也是一種思路:爬取網(wǎng)頁(yè),必須解析CSS,獲取偽元素的內容,增加了爬蟲(chóng)的難度。
  3.5 元素定位疊加
  示例:去哪里
  數學(xué)愛(ài)好者在哪里?對于一個(gè)4位數的票價(jià),先用四個(gè)i標簽渲染,然后用兩個(gè)b標簽進(jìn)行絕對定位偏移,覆蓋故意顯示錯誤的i標簽,最后在視覺(jué)上形成正確的價(jià)格……
  這說(shuō)明爬蟲(chóng)無(wú)法解析CSS,必須做數學(xué)題。
  3.6 IFRAME 異步加載
  例子:
  打開(kāi)網(wǎng)易云音樂(lè )頁(yè)面時(shí),html源碼中幾乎只有一個(gè)iframe,其src為空:about:blank。然后js開(kāi)始運行,整個(gè)頁(yè)面的frame異步塞進(jìn)iframe中……
  不過(guò)這種方式帶來(lái)的難度并不大,只是在異步和iframe處理上走了彎路(或者還有其他原因,不完全基于反爬的考慮),不管你用selenium還是phantom,都有API可用于 iframe 中的內容信息。
  3.7 個(gè)字符分割
  示例:全網(wǎng)代理IP
  在一些顯示代理IP信息的頁(yè)面上,IP的保護也很麻煩。
  他們會(huì )先將 IP 號和符號劃分為 dom 節點(diǎn),然后在中間插入混淆數字。如果爬蟲(chóng)不知道這個(gè)策略,就會(huì )認為自己成功獲取了值;但如果爬蟲(chóng)注意到,它就會(huì )被解決。.
  3.8 個(gè)字符集替換
  示例:去哪里移動(dòng)邊
  移動(dòng)版去哪兒也會(huì )欺騙爬蟲(chóng)。
  3211明明寫(xiě)在html里,但是1233是直觀(guān)顯示的。原來(lái)他們重新定義了字符集,3和1的順序剛好互換了結果……
  4.示例:爬取百度圖庫
  import re
import os
import time
import requests
# from selenium import webdriver
#########################
###此段代碼不需要關(guān)心啥意思###
#########################
if not os.path.exists(&#39;百度圖片&#39;):
os.mkdir(&#39;百度圖片&#39;)
#####################
###限制30張圖片的代碼###
####################
# 獲取所有圖片
response = requests.get(
&#39;http://image.baidu.com/search/ ... rd%3D風(fēng)景&#39;)
data = response.text
img_desc_dics = re.findall("app.setData(\(&#39;imgData.*?\));", data, re.S)[0]
img_desc_dics = eval(str(img_desc_dics))
# 獲取所有圖片的數據
img_datas = img_desc_dics[1][&#39;data&#39;]
count = 0
for img_data in img_datas:
# 獲取搜索圖片的參數
os_ = img_data.get(&#39;os&#39;)
cs_ = img_data.get(&#39;cs&#39;)
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f&#39;http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}&#39;
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall(&#39;&#39;&#39;\(&#39;firstSc&#39;\);" src="(.*?)"&#39;&#39;&#39;, img_search_data)[0]
img_name = img_url.split(&#39;/&#39;)[-1]
img_name = os.path.join(&#39;百度圖片&#39;, img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, &#39;wb&#39;)
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f&#39;{img_name}保存成功,成功保存{count}張&#39;)
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
  
  #########################################################################
###自行百度selenium的用法,使用這一套代碼可以無(wú)限爬取所有圖片,否則將被限制30張###
## 記得加庫哦
########################################################################
page_count_end = 2 # 爬取 指定數字(10)* 30 = 300張圖片
chrome = webdriver.Chrome()
## 安裝谷歌插件
##http://chromedriver.storage.go ... iomsg
## 查看你電腦的谷歌版本,尋找對應版本進(jìn)行下載解壓
try:
chrome.implicitly_wait(10)
chrome.get(
&#39;http://image.baidu.com/search/ ... rd%3D風(fēng)景&#39;)
js_code = &#39;&#39;&#39;
window.scrollTo(0, document.body.scrollHeight);
var lenOfPage = document.body.scrollHeight;
return lenOfPage
&#39;&#39;&#39;
# selenium控制爬取頁(yè)數
count = 0
page_count = 0
while page_count < page_count_end:
try:
page_count += 1
chrome.execute_script(js_code)
time.sleep(0.3)
except:
continue
img_desc_search_urls = re.findall(&#39;href="(/search/detail\?.*?)"&#39;, chrome.page_source, re.S) # re.S使.可以匹配換行符
# 獲取所有圖片的數據
for img_data in img_desc_search_urls:
try:
# 獲取搜索圖片的參數
os_ = re.findall(&#39;os=(.*?)&amp;&#39;, img_data)[0]
cs_ = re.findall(&#39;cs=(.*?)&amp;&#39;, img_data)[0]
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f&#39;http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}&#39;
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall(&#39;&#39;&#39;\(&#39;firstSc&#39;\);" src="(.*?)"&#39;&#39;&#39;, img_search_data)[0]
img_name = img_url.split(&#39;/&#39;)[-1]
img_name = os.path.join(&#39;百度圖片&#39;, img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, &#39;wb&#39;)
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f&#39;{img_name}保存成功,成功保存{count}張&#39;)
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
except:
continue
except Exception:
pass
finally:
chrome.close()
  結果
  
  
  由于百度的反爬措施是不斷更新的,如果過(guò)了一段時(shí)間還想爬,就需要尋找新的規則
  5.總結
  對于每個(gè) 網(wǎng)站 爬行,都有一定的規則。每一個(gè)網(wǎng)站,尤其是大的網(wǎng)站,都在定期排版。做爬蟲(chóng),必須注意細節,慎重決策。對于成敗,找到你需要的文字、圖片,或者視頻、文件等,找到它們的鏈接,進(jìn)行多重分析,耐心找出規律,這是你成功的關(guān)鍵。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(一張前端與反爬蟲(chóng)這一的區別)
  [目錄](méi)
  1. 前言
  對于一個(gè)網(wǎng)頁(yè),我們往往希望它結構合理,內容清晰,以便搜索引擎能夠準確識別。另一方面,還有一些我們不希望內容被輕易獲取的場(chǎng)景,比如電商的交易量網(wǎng)站、教育話(huà)題網(wǎng)站等。因為這些內容往往是產(chǎn)品的命脈,必須得到有效保護。這就是爬行動(dòng)物和反爬行動(dòng)物的話(huà)題的由來(lái)。爬取圖片的整體操作流程可以分為三個(gè)步驟:
  獲取頁(yè)面信息 讀取圖片鏈接并將圖片保存在本地指定目錄
  2. 常見(jiàn)的反爬蟲(chóng)策略
  但是世界上沒(méi)有可以完美反爬蟲(chóng)的網(wǎng)站。
  如果頁(yè)面想要在不給爬蟲(chóng)機會(huì )的情況下正常顯示在用戶(hù)面前,它必須能夠識別真人和機器人。因此,工程師們進(jìn)行了各種嘗試。這些策略大多用在后端,也是目前比較常規有效的手段,比如:
  而爬行動(dòng)物可以無(wú)限接近真人,比如:
  所以我們說(shuō),100% 反爬策略?不存在的。這更像是一種體力活動(dòng),這是一個(gè)困難的問(wèn)題。
  不過(guò)作為前端工程師,我們可以增加游戲的難度,設計一些非常(sang)有意義(bing)思維(kuang)**的反爬蟲(chóng)策略。
  3.前端和反爬蟲(chóng)3.1 FONT-FACE拼湊
  示例:貓眼電影
  在貓眼電影中,票房數據并不是純粹的數字。頁(yè)面使用font-face定義字符集,使用unicode映射顯示。也就是說(shuō),除了圖像識別,還要同時(shí)爬取字符集才能識別數字。
  而且,每次頁(yè)面刷新,字符集的url都會(huì )發(fā)生變化,這無(wú)疑增加了爬取成本,難度更大。
  3.2 背景拼湊
  例子:
  與字體的策略類(lèi)似,美團使用背景拼湊。數字實(shí)際上是圖片,根據不同的背景偏移量顯示不同的字符。
  而不同的頁(yè)面,圖片的字符排序也不同。但是理論上只需要生成0-9和一個(gè)小數點(diǎn),所以不明白為什么會(huì )有重復的字符。
  3.3 個(gè)字符穿插
  示例:微信公眾號文章
  一些微信公眾號的文章中穿插著(zhù)各種神秘的人物,這些人物都是通過(guò)樣式隱藏起來(lái)的。這種方法雖然令人震驚……但其實(shí)識別過(guò)濾也不是太難,甚至可以做得更好,但也是一種腦洞。
  3.4 偽元素隱藏
  示例:汽車(chē)主頁(yè)
  汽車(chē)之家,關(guān)鍵制造商信息被放入偽元素的內容中。這也是一種思路:爬取網(wǎng)頁(yè),必須解析CSS,獲取偽元素的內容,增加了爬蟲(chóng)的難度。
  3.5 元素定位疊加
  示例:去哪里
  數學(xué)愛(ài)好者在哪里?對于一個(gè)4位數的票價(jià),先用四個(gè)i標簽渲染,然后用兩個(gè)b標簽進(jìn)行絕對定位偏移,覆蓋故意顯示錯誤的i標簽,最后在視覺(jué)上形成正確的價(jià)格……
  這說(shuō)明爬蟲(chóng)無(wú)法解析CSS,必須做數學(xué)題。
  3.6 IFRAME 異步加載
  例子:
  打開(kāi)網(wǎng)易云音樂(lè )頁(yè)面時(shí),html源碼中幾乎只有一個(gè)iframe,其src為空:about:blank。然后js開(kāi)始運行,整個(gè)頁(yè)面的frame異步塞進(jìn)iframe中……
  不過(guò)這種方式帶來(lái)的難度并不大,只是在異步和iframe處理上走了彎路(或者還有其他原因,不完全基于反爬的考慮),不管你用selenium還是phantom,都有API可用于 iframe 中的內容信息。
  3.7 個(gè)字符分割
  示例:全網(wǎng)代理IP
  在一些顯示代理IP信息的頁(yè)面上,IP的保護也很麻煩。
  他們會(huì )先將 IP 號和符號劃分為 dom 節點(diǎn),然后在中間插入混淆數字。如果爬蟲(chóng)不知道這個(gè)策略,就會(huì )認為自己成功獲取了值;但如果爬蟲(chóng)注意到,它就會(huì )被解決。.
  3.8 個(gè)字符集替換
  示例:去哪里移動(dòng)邊
  移動(dòng)版去哪兒也會(huì )欺騙爬蟲(chóng)。
  3211明明寫(xiě)在html里,但是1233是直觀(guān)顯示的。原來(lái)他們重新定義了字符集,3和1的順序剛好互換了結果……
  4.示例:爬取百度圖庫
  import re
import os
import time
import requests
# from selenium import webdriver
#########################
###此段代碼不需要關(guān)心啥意思###
#########################
if not os.path.exists(&#39;百度圖片&#39;):
os.mkdir(&#39;百度圖片&#39;)
#####################
###限制30張圖片的代碼###
####################
# 獲取所有圖片
response = requests.get(
&#39;http://image.baidu.com/search/ ... rd%3D風(fēng)景&#39;)
data = response.text
img_desc_dics = re.findall("app.setData(\(&#39;imgData.*?\));", data, re.S)[0]
img_desc_dics = eval(str(img_desc_dics))
# 獲取所有圖片的數據
img_datas = img_desc_dics[1][&#39;data&#39;]
count = 0
for img_data in img_datas:
# 獲取搜索圖片的參數
os_ = img_data.get(&#39;os&#39;)
cs_ = img_data.get(&#39;cs&#39;)
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f&#39;http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}&#39;
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall(&#39;&#39;&#39;\(&#39;firstSc&#39;\);" src="(.*?)"&#39;&#39;&#39;, img_search_data)[0]
img_name = img_url.split(&#39;/&#39;)[-1]
img_name = os.path.join(&#39;百度圖片&#39;, img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, &#39;wb&#39;)
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f&#39;{img_name}保存成功,成功保存{count}張&#39;)
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
  
  #########################################################################
###自行百度selenium的用法,使用這一套代碼可以無(wú)限爬取所有圖片,否則將被限制30張###
## 記得加庫哦
########################################################################
page_count_end = 2 # 爬取 指定數字(10)* 30 = 300張圖片
chrome = webdriver.Chrome()
## 安裝谷歌插件
##http://chromedriver.storage.go ... iomsg
## 查看你電腦的谷歌版本,尋找對應版本進(jìn)行下載解壓
try:
chrome.implicitly_wait(10)
chrome.get(
&#39;http://image.baidu.com/search/ ... rd%3D風(fēng)景&#39;)
js_code = &#39;&#39;&#39;
window.scrollTo(0, document.body.scrollHeight);
var lenOfPage = document.body.scrollHeight;
return lenOfPage
&#39;&#39;&#39;
# selenium控制爬取頁(yè)數
count = 0
page_count = 0
while page_count < page_count_end:
try:
page_count += 1
chrome.execute_script(js_code)
time.sleep(0.3)
except:
continue
img_desc_search_urls = re.findall(&#39;href="(/search/detail\?.*?)"&#39;, chrome.page_source, re.S) # re.S使.可以匹配換行符
# 獲取所有圖片的數據
for img_data in img_desc_search_urls:
try:
# 獲取搜索圖片的參數
os_ = re.findall(&#39;os=(.*?)&amp;&#39;, img_data)[0]
cs_ = re.findall(&#39;cs=(.*?)&amp;&#39;, img_data)[0]
if os_ and cs_:
# 獲取搜索圖片的信息
img_search_url = f&#39;http://image.baidu.com/search/ ... cs%3D{cs_}&os={os_}&#39;
img_search_response = requests.get(img_search_url)
img_search_data = img_search_response.text
# 獲取圖片信息
img_url = re.findall(&#39;&#39;&#39;\(&#39;firstSc&#39;\);" src="(.*?)"&#39;&#39;&#39;, img_search_data)[0]
img_name = img_url.split(&#39;/&#39;)[-1]
img_name = os.path.join(&#39;百度圖片&#39;, img_name) # 拼接出圖片的地址,如 百度圖片/3822951_144045377000_2.jpg
# 保存圖片
img_response = requests.get(img_url)
img_data = img_response.content
fw = open(img_name, &#39;wb&#39;)
fw.write(img_data)
fw.flush()
# 提示
count += 1
print(f&#39;{img_name}保存成功,成功保存{count}張&#39;)
# 防止百度禁ip,慢一點(diǎn)
time.sleep(0.01)
except:
continue
except Exception:
pass
finally:
chrome.close()
  結果
  
  
  由于百度的反爬措施是不斷更新的,如果過(guò)了一段時(shí)間還想爬,就需要尋找新的規則
  5.總結
  對于每個(gè) 網(wǎng)站 爬行,都有一定的規則。每一個(gè)網(wǎng)站,尤其是大的網(wǎng)站,都在定期排版。做爬蟲(chóng),必須注意細節,慎重決策。對于成敗,找到你需要的文字、圖片,或者視頻、文件等,找到它們的鏈接,進(jìn)行多重分析,耐心找出規律,這是你成功的關(guān)鍵。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何使用加載加載技術(shù)的網(wǎng)頁(yè)數據異步技術(shù)(圖) )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-02-06 21:21 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何使用加載加載技術(shù)的網(wǎng)頁(yè)數據異步技術(shù)(圖)
)
  當你搜索百度圖片(百度圖片)時(shí),你會(huì )發(fā)現,當你向下滑動(dòng)鼠標時(shí),會(huì )自動(dòng)加載下一頁(yè)的圖片數據,但是網(wǎng)頁(yè)的URL并沒(méi)有改變。因此,您無(wú)法通過(guò)通常的構建 URL 的方法來(lái)抓取 Web 數據。這是由于網(wǎng)頁(yè)使用的異步加載技術(shù)。
  異步加載技術(shù)
  傳統網(wǎng)頁(yè)如果需要更新網(wǎng)頁(yè)信息,則需要重新加載整個(gè)網(wǎng)頁(yè)的數據信息。因此,會(huì )出現加載速度慢的情況,導致用戶(hù)體驗不佳。但是,使用異步加載技術(shù)加載網(wǎng)頁(yè)數據,會(huì )通過(guò)后臺與服務(wù)器之間的少量數據交換來(lái)完成數據更新。
  接下來(lái),我們將描述如何使用異步加載技術(shù)來(lái)抓取 Web 數據。以簡(jiǎn)書(shū)網(wǎng)為例()網(wǎng)頁(yè)是《從零開(kāi)始學(xué)Python網(wǎng)絡(luò )爬蟲(chóng)》作者羅攀的主頁(yè)。我們的目的是抓取用戶(hù)文章主題
  
  1、在Chrome瀏覽器中按F12或者右鍵動(dòng)態(tài)-&gt;勾選,繼續向下滾動(dòng)瀏覽其他沒(méi)有變化的動(dòng)態(tài)發(fā)現頁(yè)面的URL。選擇 Network-&gt;XHR-&gt;Response 選項將觀(guān)察到網(wǎng)頁(yè)返回一個(gè) XML 文件。
  
  2、連續向下滑動(dòng)頁(yè)面觀(guān)察Name列的數據,獲取之前頁(yè)面的URL
  3、通過(guò)分析網(wǎng)頁(yè)數據,我們可以得到常規的url,然后爬取數據就容易多了。下面的代碼:
  import requests
import re
#構造URL列表
urls = [&#39;https://www.jianshu.com/u/9104 ... ge%3D{0}/u&#39;.format(str(i)) for i in range(1,20)]
headers = {&#39;user-agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36&#39;}
for url in urls:
res = requests.get(url,headers = headers)
selsctor = re.findall(&#39;(.*?)&#39;,res.content.decode(&#39;utf-8&#39;),re.S)
for i in selsctor:
print(i) 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何使用加載加載技術(shù)的網(wǎng)頁(yè)數據異步技術(shù)(圖)
)
  當你搜索百度圖片(百度圖片)時(shí),你會(huì )發(fā)現,當你向下滑動(dòng)鼠標時(shí),會(huì )自動(dòng)加載下一頁(yè)的圖片數據,但是網(wǎng)頁(yè)的URL并沒(méi)有改變。因此,您無(wú)法通過(guò)通常的構建 URL 的方法來(lái)抓取 Web 數據。這是由于網(wǎng)頁(yè)使用的異步加載技術(shù)。
  異步加載技術(shù)
  傳統網(wǎng)頁(yè)如果需要更新網(wǎng)頁(yè)信息,則需要重新加載整個(gè)網(wǎng)頁(yè)的數據信息。因此,會(huì )出現加載速度慢的情況,導致用戶(hù)體驗不佳。但是,使用異步加載技術(shù)加載網(wǎng)頁(yè)數據,會(huì )通過(guò)后臺與服務(wù)器之間的少量數據交換來(lái)完成數據更新。
  接下來(lái),我們將描述如何使用異步加載技術(shù)來(lái)抓取 Web 數據。以簡(jiǎn)書(shū)網(wǎng)為例()網(wǎng)頁(yè)是《從零開(kāi)始學(xué)Python網(wǎng)絡(luò )爬蟲(chóng)》作者羅攀的主頁(yè)。我們的目的是抓取用戶(hù)文章主題
  
  1、在Chrome瀏覽器中按F12或者右鍵動(dòng)態(tài)-&gt;勾選,繼續向下滾動(dòng)瀏覽其他沒(méi)有變化的動(dòng)態(tài)發(fā)現頁(yè)面的URL。選擇 Network-&gt;XHR-&gt;Response 選項將觀(guān)察到網(wǎng)頁(yè)返回一個(gè) XML 文件。
  
  2、連續向下滑動(dòng)頁(yè)面觀(guān)察Name列的數據,獲取之前頁(yè)面的URL
  3、通過(guò)分析網(wǎng)頁(yè)數據,我們可以得到常規的url,然后爬取數據就容易多了。下面的代碼:
  import requests
import re
#構造URL列表
urls = [&#39;https://www.jianshu.com/u/9104 ... ge%3D{0}/u&#39;.format(str(i)) for i in range(1,20)]
headers = {&#39;user-agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36&#39;}
for url in urls:
res = requests.get(url,headers = headers)
selsctor = re.findall(&#39;(.*?)&#39;,res.content.decode(&#39;utf-8&#39;),re.S)
for i in selsctor:
print(i)

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python的爬蟲(chóng)模塊訓練集圖片數據采集圖片集 )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 129 次瀏覽 ? 2022-02-06 03:00 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python的爬蟲(chóng)模塊訓練集圖片數據采集圖片集
)
  百度圖庫關(guān)鍵詞爬蟲(chóng)腳本本章設計了一個(gè)基于Python的爬蟲(chóng)模塊,可以根據用戶(hù)自定義的關(guān)鍵詞和要爬取的圖片數量,自動(dòng)保存百度圖庫采集中的圖片數據。功能設計與分析
  該模塊為后續模型訓練提供了一個(gè)數據集,屬于data采集部分。該模塊的功能應解決以下問(wèn)題:
  目標網(wǎng)站的圖片數量足夠多,車(chē)輛類(lèi)型涵蓋基本類(lèi)型,爬取難度不要太高。綜合分析,百度圖庫可以滿(mǎn)足上述要求。因此以百度圖庫為目標爬取網(wǎng)站。爬蟲(chóng)模塊應該能夠根據不同的輸入危險車(chē)輛類(lèi)別爬取不同類(lèi)型的車(chē)輛圖片,所以要求爬蟲(chóng)模塊能夠根據不同的車(chē)輛類(lèi)別名稱(chēng)爬取圖片采集圖片爬蟲(chóng)模塊應該是能夠根據用戶(hù)指定的編號爬取采集圖片,然后對Python語(yǔ)言爬蟲(chóng)相關(guān)庫進(jìn)行編號分類(lèi)
  
<p>#/*
#* @Author: hujinlei
#* @Date: 2018-06-07 20:50:31
#* @Last Modified by: hjl
#* @Last Modified time: 2018-06-07 20:50:31
#*/
import os
import re
#import urllib
import json
import socket
import urllib.request
import urllib.parse
import urllib.error
# 設置超時(shí)
import time
timeout = 8
socket.setdefaulttimeout(timeout)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Crawler:
# 睡眠時(shí)長(cháng)
__time_sleep = 0.1
__amount = 0
__start_amount = 0
__counter = 0
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
# 獲取圖片url內容等
# t 下載圖片時(shí)間間隔
def __init__(self, t=0.1):
self.time_sleep = t
# 獲取后綴名
def get_suffix(self, name):
m = re.search(r'\.[^\.]*$', name)
if m.group(0) and len(m.group(0)) 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python的爬蟲(chóng)模塊訓練集圖片數據采集圖片集
)
  百度圖庫關(guān)鍵詞爬蟲(chóng)腳本本章設計了一個(gè)基于Python的爬蟲(chóng)模塊,可以根據用戶(hù)自定義的關(guān)鍵詞和要爬取的圖片數量,自動(dòng)保存百度圖庫采集中的圖片數據。功能設計與分析
  該模塊為后續模型訓練提供了一個(gè)數據集,屬于data采集部分。該模塊的功能應解決以下問(wèn)題:
  目標網(wǎng)站的圖片數量足夠多,車(chē)輛類(lèi)型涵蓋基本類(lèi)型,爬取難度不要太高。綜合分析,百度圖庫可以滿(mǎn)足上述要求。因此以百度圖庫為目標爬取網(wǎng)站。爬蟲(chóng)模塊應該能夠根據不同的輸入危險車(chē)輛類(lèi)別爬取不同類(lèi)型的車(chē)輛圖片,所以要求爬蟲(chóng)模塊能夠根據不同的車(chē)輛類(lèi)別名稱(chēng)爬取圖片采集圖片爬蟲(chóng)模塊應該是能夠根據用戶(hù)指定的編號爬取采集圖片,然后對Python語(yǔ)言爬蟲(chóng)相關(guān)庫進(jìn)行編號分類(lèi)
  
<p>#/*
#* @Author: hujinlei
#* @Date: 2018-06-07 20:50:31
#* @Last Modified by: hjl
#* @Last Modified time: 2018-06-07 20:50:31
#*/
import os
import re
#import urllib
import json
import socket
import urllib.request
import urllib.parse
import urllib.error
# 設置超時(shí)
import time
timeout = 8
socket.setdefaulttimeout(timeout)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Crawler:
# 睡眠時(shí)長(cháng)
__time_sleep = 0.1
__amount = 0
__start_amount = 0
__counter = 0
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
# 獲取圖片url內容等
# t 下載圖片時(shí)間間隔
def __init__(self, t=0.1):
self.time_sleep = t
# 獲取后綴名
def get_suffix(self, name):
m = re.search(r'\.[^\.]*$', name)
if m.group(0) and len(m.group(0))

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)有特別的優(yōu)勢)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 115 次瀏覽 ? 2022-02-06 02:23 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)有特別的優(yōu)勢)
  1.什么是爬蟲(chóng)
  爬蟲(chóng),網(wǎng)絡(luò )爬蟲(chóng),可以理解為在互聯(lián)網(wǎng)上爬行的蜘蛛?;ヂ?lián)網(wǎng)就像一張大網(wǎng),爬蟲(chóng)就是在這張網(wǎng)上四處爬行的蜘蛛。如果遇到資源,就會(huì )被搶。你想搶什么?由你來(lái)控制它。例如,它正在抓取網(wǎng)頁(yè)。在這個(gè)網(wǎng)頁(yè)中,它找到了一條路,這條路實(shí)際上是一個(gè)指向網(wǎng)頁(yè)的超鏈接。然后它可以爬到另一個(gè)網(wǎng)站來(lái)獲取數據。這樣一來(lái),整個(gè)互聯(lián)網(wǎng)絡(luò )對這只蜘蛛來(lái)說(shuō)觸手可及,分分鐘爬下來(lái)也不是問(wèn)題。
  網(wǎng)絡(luò )爬蟲(chóng)是一組可以自動(dòng)從網(wǎng)站的相關(guān)網(wǎng)頁(yè)中搜索和提取數據的程序。提取和存儲這些數據是進(jìn)一步數據分析的關(guān)鍵和前提。Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)具有特殊優(yōu)勢。尤其是業(yè)界有專(zhuān)門(mén)為Python編寫(xiě)的各種爬蟲(chóng)程序框架,使得爬蟲(chóng)程序的編寫(xiě)更加簡(jiǎn)單高效。
  Python 是一種面向對象的解釋型計算機編程語(yǔ)言。它是開(kāi)源的、免費的、功能強大的,并且語(yǔ)法簡(jiǎn)潔明了。它擁有豐富而強大的庫。它是一種廣泛使用的編程語(yǔ)言。
  2.瀏覽網(wǎng)頁(yè)的過(guò)程
  在用戶(hù)瀏覽網(wǎng)頁(yè)的過(guò)程中,我們可能會(huì )看到很多漂亮的圖片,比如我們會(huì )看到幾張圖片和百度搜索框,這個(gè)過(guò)程其實(shí)就是用戶(hù)輸入網(wǎng)址后,經(jīng)過(guò)DNS服務(wù)器,找到服務(wù)器主機, 向服務(wù)器發(fā)送請求,服務(wù)器解析后向用戶(hù)瀏覽器發(fā)送HTML、JS、CSS等文件。瀏覽器解析后,用戶(hù)可以看到各種圖片。
  因此,用戶(hù)看到的網(wǎng)頁(yè)本質(zhì)上是由 HTML 代碼組成的,爬蟲(chóng)爬取這些內容。通過(guò)對這些HTML代碼進(jìn)行分析和過(guò)濾,實(shí)現圖片、文字等資源的獲取。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)有特別的優(yōu)勢)
  1.什么是爬蟲(chóng)
  爬蟲(chóng),網(wǎng)絡(luò )爬蟲(chóng),可以理解為在互聯(lián)網(wǎng)上爬行的蜘蛛?;ヂ?lián)網(wǎng)就像一張大網(wǎng),爬蟲(chóng)就是在這張網(wǎng)上四處爬行的蜘蛛。如果遇到資源,就會(huì )被搶。你想搶什么?由你來(lái)控制它。例如,它正在抓取網(wǎng)頁(yè)。在這個(gè)網(wǎng)頁(yè)中,它找到了一條路,這條路實(shí)際上是一個(gè)指向網(wǎng)頁(yè)的超鏈接。然后它可以爬到另一個(gè)網(wǎng)站來(lái)獲取數據。這樣一來(lái),整個(gè)互聯(lián)網(wǎng)絡(luò )對這只蜘蛛來(lái)說(shuō)觸手可及,分分鐘爬下來(lái)也不是問(wèn)題。
  網(wǎng)絡(luò )爬蟲(chóng)是一組可以自動(dòng)從網(wǎng)站的相關(guān)網(wǎng)頁(yè)中搜索和提取數據的程序。提取和存儲這些數據是進(jìn)一步數據分析的關(guān)鍵和前提。Python語(yǔ)言程序簡(jiǎn)單高效,編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)具有特殊優(yōu)勢。尤其是業(yè)界有專(zhuān)門(mén)為Python編寫(xiě)的各種爬蟲(chóng)程序框架,使得爬蟲(chóng)程序的編寫(xiě)更加簡(jiǎn)單高效。
  Python 是一種面向對象的解釋型計算機編程語(yǔ)言。它是開(kāi)源的、免費的、功能強大的,并且語(yǔ)法簡(jiǎn)潔明了。它擁有豐富而強大的庫。它是一種廣泛使用的編程語(yǔ)言。
  2.瀏覽網(wǎng)頁(yè)的過(guò)程
  在用戶(hù)瀏覽網(wǎng)頁(yè)的過(guò)程中,我們可能會(huì )看到很多漂亮的圖片,比如我們會(huì )看到幾張圖片和百度搜索框,這個(gè)過(guò)程其實(shí)就是用戶(hù)輸入網(wǎng)址后,經(jīng)過(guò)DNS服務(wù)器,找到服務(wù)器主機, 向服務(wù)器發(fā)送請求,服務(wù)器解析后向用戶(hù)瀏覽器發(fā)送HTML、JS、CSS等文件。瀏覽器解析后,用戶(hù)可以看到各種圖片。
  因此,用戶(hù)看到的網(wǎng)頁(yè)本質(zhì)上是由 HTML 代碼組成的,爬蟲(chóng)爬取這些內容。通過(guò)對這些HTML代碼進(jìn)行分析和過(guò)濾,實(shí)現圖片、文字等資源的獲取。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(本文側重于的系統設計和實(shí)現的部分細節,內容來(lái)源于兩方面)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-02-06 01:09 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(本文側重于的系統設計和實(shí)現的部分細節,內容來(lái)源于兩方面)
  網(wǎng)絡(luò )爬蟲(chóng)經(jīng)常被忽視,尤其是與搜索引擎的光環(huán)相比,這似乎有點(diǎn)黯淡。我很少看到 文章 或詳細說(shuō)明爬蟲(chóng)實(shí)現的文檔。但是,爬蟲(chóng)其實(shí)是一個(gè)非常重要的系統,尤其是在當今數據為王的時(shí)代。如果你是一個(gè)沒(méi)有任何原創(chuàng )數據積累的初創(chuàng )公司或項目,那么使用爬蟲(chóng)在互聯(lián)網(wǎng)上找到那些有價(jià)值的數據,然后對數據進(jìn)行清洗和整理是快速獲取數據的重要手段。
  本文重點(diǎn)介紹爬蟲(chóng)的系統設計和實(shí)現的一些細節。內容來(lái)自?xún)蓚€(gè)方面。一個(gè)是我做了一個(gè)多月的爬蟲(chóng)經(jīng)驗,但是我做的爬蟲(chóng)規模不是太大,性能要求不能滿(mǎn)足。百度這么高的要求,二是從閱讀幾個(gè)文檔中衍生出來(lái)的。我找到的關(guān)于爬蟲(chóng)系統的文獻大多是2000年左右,之后就很少了,說(shuō)明10年前爬蟲(chóng)的系統設計基本解決了(不是百度剛開(kāi)始的2000年,說(shuō)可能是它的爬蟲(chóng))也指這些文章^-^)。
  另外,由于本文關(guān)注的是系統問(wèn)題,所以有些內容就不再贅述了,比如那些隱藏的web數據如何爬取,ajax頁(yè)面如何爬取,如何動(dòng)態(tài)調整爬取頻率等等。
  文本
  一個(gè)正式的、完整的網(wǎng)絡(luò )爬蟲(chóng)其實(shí)是一個(gè)非常復雜的系統:首先,它是一個(gè)海量數據處理系統,因為它要面對的是整個(gè)互聯(lián)網(wǎng)網(wǎng)頁(yè),即使是一個(gè)小的、垂直的爬蟲(chóng),一般它也需要抓取數十億或數百億的網(wǎng)頁(yè);其次,它也是一個(gè)性能要求不錯的系統,可能需要同時(shí)下載上千個(gè)網(wǎng)頁(yè),快速提取網(wǎng)頁(yè)中的url,處理海量的url。重復數據刪除等;歸根結底,它真的不是一個(gè)面向最終用戶(hù)的系統,所以雖然也非常需要穩定性,但偶爾的宕機也不是什么災難,也不存在流量激增的情況同時(shí),如果性能在短時(shí)間內下降,這不是問(wèn)題。從這個(gè)角度來(lái)看,
  
  上圖是一個(gè)爬蟲(chóng)系統框架,基本收錄了一個(gè)爬蟲(chóng)系統所需的所有模塊。
  在任何爬蟲(chóng)系統的設計圖中,你都會(huì )發(fā)現有一個(gè)循環(huán),代表了爬蟲(chóng)的一般工作流程:根據URL下載對應的網(wǎng)頁(yè),然后提取網(wǎng)頁(yè)中收錄的URL,然后根據到這些新的 URL 下載相應的網(wǎng)頁(yè),然后一遍又一遍地重新開(kāi)始。爬蟲(chóng)系統的子模塊都位于這個(gè)循環(huán)中,完成一個(gè)特定的功能。
  這些子模塊通常包括:
  fetcher:用于根據url下載對應的網(wǎng)頁(yè);
  DNS解析器:DNS解析;
  看到的內容:網(wǎng)絡(luò )內容的重復數據刪除;
  Extractor:提取網(wǎng)頁(yè)中的url或者其他一些內容;
  URL過(guò)濾器:過(guò)濾掉不需要下載的URL;
  URL Seen:對 url 進(jìn)行重復數據刪除;
  URL Set:存儲所有的url;
  URL Frontier:類(lèi)似于調度器,決定接下來(lái)下載哪些URL對應哪些網(wǎng)頁(yè);
  提取器和 DNS 解析器
  這兩個(gè)模塊是兩個(gè)非常簡(jiǎn)單的獨立服務(wù):DNS Resolver負責域名解析;fetcher的輸入是域名解析后的url,返回的是url對應的網(wǎng)頁(yè)內容。對于任何網(wǎng)頁(yè)抓取,都需要調用這兩個(gè)模塊。
  對于一般的爬蟲(chóng)來(lái)說(shuō),這兩個(gè)模塊可以做得很簡(jiǎn)單,甚至可以合并在一起。但是對于具有高性能要求的系統,它們可能成為潛在的性能瓶頸。主要原因是域名解析和爬取都是耗時(shí)的任務(wù)。比如抓取網(wǎng)頁(yè)時(shí),一般延遲在幾百毫秒。如果遇到慢網(wǎng)站,可能需要幾秒甚至十幾秒,會(huì )導致工作線(xiàn)程阻塞等待很長(cháng)時(shí)間。如果希望 Fetcher 能夠每秒下載數千頁(yè)或更多頁(yè)面,則需要啟動(dòng)大量工作線(xiàn)程。
  因此,對于性能要求較高的爬蟲(chóng)系統,一般采用epoll或類(lèi)似的技術(shù),將兩個(gè)模塊改成異步機制。另外,DNS解析的結果也被緩存,大大減少了DNS解析的操作。
  看到的內容
  互聯(lián)網(wǎng)上有些網(wǎng)站經(jīng)常有鏡像網(wǎng)站(鏡像),即兩個(gè)網(wǎng)站的內容相同但網(wǎng)頁(yè)對應的域名不同。這將導致多次重復爬取同一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。為了避免這種情況,對于每一個(gè)爬取的網(wǎng)頁(yè),首先需要進(jìn)入 Content Seen 模塊。模塊會(huì )判斷網(wǎng)頁(yè)內容與下載的網(wǎng)頁(yè)內容是否一致。如果它們一致,則不會(huì )發(fā)送網(wǎng)頁(yè)進(jìn)行進(jìn)一步處理。這種方法可以顯著(zhù)減少爬蟲(chóng)需要下載的網(wǎng)頁(yè)數量。
  至于判斷兩個(gè)網(wǎng)頁(yè)的內容是否一致,大致思路是這樣的:不是直接比較兩個(gè)網(wǎng)頁(yè)的內容,而是計算網(wǎng)頁(yè)的內容,生成一個(gè)FingerPrint(指紋),通常是一個(gè)指紋是固定長(cháng)度。該字符串比網(wǎng)頁(yè)的正文短得多。如果兩個(gè)網(wǎng)頁(yè)的指紋相同,則認為它們的內容相同。
  提取器和 URL 過(guò)濾器
  提取器的工作是從下載的網(wǎng)頁(yè)中提取它收錄的所有 URL。這是一項精細的工作,需要考慮所有可能的 url 樣式,例如網(wǎng)頁(yè)中往往收錄相對路徑 url,在提取時(shí)需要將其轉換為絕對路徑。
  Url Filter 是對提取的 url 進(jìn)行再次過(guò)濾。不同的應用有不同的篩選標準。比如baidu/google搜索一般不會(huì )被屏蔽,但是對于垂直搜索或者定向爬取的應用,可能只需要滿(mǎn)足一定條件的url,比如不需要圖片的url,比如只需要一個(gè)圖片的url需要具體的網(wǎng)站等。Url Filter是一個(gè)與應用密切相關(guān)的模塊。
  看到的網(wǎng)址
  Url Seen 用于對 url 進(jìn)行重復數據刪除。之前寫(xiě)過(guò)一篇關(guān)于url去重的博客,這里不再贅述。
  對于一個(gè)大型爬蟲(chóng)系統來(lái)說(shuō),它可能已經(jīng)有 100 億或 1000 億個(gè) URL。如何快速判斷是否出現了新的 URL 非常重要。因為大型爬蟲(chóng)系統可能在一秒鐘內下載數千個(gè)網(wǎng)頁(yè),一個(gè)網(wǎng)頁(yè)一般可以提取幾十個(gè)url,每個(gè)url都需要進(jìn)行去重操作??梢韵胂?,每秒需要執行大量的去重操作。. 因此 Url Seen 是整個(gè)爬蟲(chóng)系統中技術(shù)含量很高的部分。(Content Seen其實(shí)有這個(gè)問(wèn)題)
  網(wǎng)址集
  url經(jīng)過(guò)前面的一系列處理后,會(huì )被放入到Url Set中進(jìn)行調度獲取。由于 url 數量眾多,可能只有一小部分會(huì )放在內存中,而大部分會(huì )寫(xiě)入磁盤(pán)。通常,Url Set 的實(shí)現是一些文件或數據庫。
  網(wǎng)址邊界
  Frontier(不知道為什么叫這個(gè)名字)放在最后是因為它可以說(shuō)是整個(gè)爬蟲(chóng)系統的引擎和驅動(dòng),組織和調用其他模塊。
  當爬蟲(chóng)啟動(dòng)時(shí),Frontier 內部會(huì )有一些種子 url。它首先將種子url發(fā)送給Fetcher進(jìn)行抓取,然后將抓取的網(wǎng)頁(yè)發(fā)送給Extractor提取新的url,然后將新的url重放進(jìn)入Url Set;而當 Frontier 里面的 url 已經(jīng)被爬取完畢時(shí),它會(huì )從 Url Set 中提取那些沒(méi)有被爬取的新 url,如此循環(huán)往復。
  Frontier的調度實(shí)現有很多,這里只介紹最常用的實(shí)現方式。在此之前,需要稍微解釋一下。雖然我們在介紹 Fetcher 的時(shí)候說(shuō)過(guò),一個(gè)好的 Fetcher 每秒可以下載幾十萬(wàn)個(gè)網(wǎng)頁(yè),但是對于特定的目標 網(wǎng)站,比如爬蟲(chóng)系統會(huì )爬得很慢,而且只會(huì )每十秒被抓一次。這是為了確保目標 網(wǎng)站 不會(huì )被爬蟲(chóng)捕獲。
  為了做到這一點(diǎn),Frontier 內部對每個(gè)域名都有一個(gè)對應的 FIFO 隊列,該隊列存儲了域名下的 url。Frontier 每次都會(huì )從某個(gè)隊列中拉出一個(gè) url 進(jìn)行爬取。隊列將保存 Frontier 上次調用它的時(shí)間。如果時(shí)間距離已經(jīng)超過(guò)某個(gè)值,則可以再次調用隊列。
  Frontier 可能同時(shí)有上千個(gè)這樣的隊列,它會(huì )輪詢(xún)得到一個(gè)可以調用的隊列,然后從隊列中拉出一個(gè) url 去獲取。一旦隊列中的所有url都被消費到一定程度,Frontier就會(huì )從Url Set中抽取一批新的url,放入對應的隊列中。
  分散式
  當單機版爬蟲(chóng)性能不能滿(mǎn)足要求時(shí),應考慮使用多臺機器組成分布式爬蟲(chóng)系統。分布式爬蟲(chóng)架構其實(shí)比想象的要簡(jiǎn)單得多。一個(gè)簡(jiǎn)單的做法是:假設有N臺機器,每臺機器都有一個(gè)完整的爬蟲(chóng)系統在運行,每臺機器的爬蟲(chóng)都在從Extractor模塊中獲取新的信息。在url之后,根據url的域名進(jìn)行hash,然后取模N得到結果n,然后將url放入第n臺機器的Url Set中。這樣,不同的網(wǎng)站 URL就會(huì )在不同的機器上處理。
  以上是完整爬蟲(chóng)的系統實(shí)現。當然,由于篇幅限制,有些細節被省略了。例如,在爬取每個(gè)網(wǎng)站之前,爬蟲(chóng)需要讀取網(wǎng)站的robots.txt來(lái)判斷網(wǎng)站是否允許被爬?。ň〇|把robots. txt 前一段時(shí)間在 robots.txt 中)。一淘的爬蟲(chóng)被堵住了。需要注意的是robots.txt只是行業(yè)協(xié)議,在技術(shù)上不能強行拒絕爬蟲(chóng)的爬?。?;再例如,一些網(wǎng)站 提供站點(diǎn)地圖,它可以直接從站點(diǎn)地圖中獲取該網(wǎng)站 的所有url;等等。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(本文側重于的系統設計和實(shí)現的部分細節,內容來(lái)源于兩方面)
  網(wǎng)絡(luò )爬蟲(chóng)經(jīng)常被忽視,尤其是與搜索引擎的光環(huán)相比,這似乎有點(diǎn)黯淡。我很少看到 文章 或詳細說(shuō)明爬蟲(chóng)實(shí)現的文檔。但是,爬蟲(chóng)其實(shí)是一個(gè)非常重要的系統,尤其是在當今數據為王的時(shí)代。如果你是一個(gè)沒(méi)有任何原創(chuàng )數據積累的初創(chuàng )公司或項目,那么使用爬蟲(chóng)在互聯(lián)網(wǎng)上找到那些有價(jià)值的數據,然后對數據進(jìn)行清洗和整理是快速獲取數據的重要手段。
  本文重點(diǎn)介紹爬蟲(chóng)的系統設計和實(shí)現的一些細節。內容來(lái)自?xún)蓚€(gè)方面。一個(gè)是我做了一個(gè)多月的爬蟲(chóng)經(jīng)驗,但是我做的爬蟲(chóng)規模不是太大,性能要求不能滿(mǎn)足。百度這么高的要求,二是從閱讀幾個(gè)文檔中衍生出來(lái)的。我找到的關(guān)于爬蟲(chóng)系統的文獻大多是2000年左右,之后就很少了,說(shuō)明10年前爬蟲(chóng)的系統設計基本解決了(不是百度剛開(kāi)始的2000年,說(shuō)可能是它的爬蟲(chóng))也指這些文章^-^)。
  另外,由于本文關(guān)注的是系統問(wèn)題,所以有些內容就不再贅述了,比如那些隱藏的web數據如何爬取,ajax頁(yè)面如何爬取,如何動(dòng)態(tài)調整爬取頻率等等。
  文本
  一個(gè)正式的、完整的網(wǎng)絡(luò )爬蟲(chóng)其實(shí)是一個(gè)非常復雜的系統:首先,它是一個(gè)海量數據處理系統,因為它要面對的是整個(gè)互聯(lián)網(wǎng)網(wǎng)頁(yè),即使是一個(gè)小的、垂直的爬蟲(chóng),一般它也需要抓取數十億或數百億的網(wǎng)頁(yè);其次,它也是一個(gè)性能要求不錯的系統,可能需要同時(shí)下載上千個(gè)網(wǎng)頁(yè),快速提取網(wǎng)頁(yè)中的url,處理海量的url。重復數據刪除等;歸根結底,它真的不是一個(gè)面向最終用戶(hù)的系統,所以雖然也非常需要穩定性,但偶爾的宕機也不是什么災難,也不存在流量激增的情況同時(shí),如果性能在短時(shí)間內下降,這不是問(wèn)題。從這個(gè)角度來(lái)看,
  
  上圖是一個(gè)爬蟲(chóng)系統框架,基本收錄了一個(gè)爬蟲(chóng)系統所需的所有模塊。
  在任何爬蟲(chóng)系統的設計圖中,你都會(huì )發(fā)現有一個(gè)循環(huán),代表了爬蟲(chóng)的一般工作流程:根據URL下載對應的網(wǎng)頁(yè),然后提取網(wǎng)頁(yè)中收錄的URL,然后根據到這些新的 URL 下載相應的網(wǎng)頁(yè),然后一遍又一遍地重新開(kāi)始。爬蟲(chóng)系統的子模塊都位于這個(gè)循環(huán)中,完成一個(gè)特定的功能。
  這些子模塊通常包括:
  fetcher:用于根據url下載對應的網(wǎng)頁(yè);
  DNS解析器:DNS解析;
  看到的內容:網(wǎng)絡(luò )內容的重復數據刪除;
  Extractor:提取網(wǎng)頁(yè)中的url或者其他一些內容;
  URL過(guò)濾器:過(guò)濾掉不需要下載的URL;
  URL Seen:對 url 進(jìn)行重復數據刪除;
  URL Set:存儲所有的url;
  URL Frontier:類(lèi)似于調度器,決定接下來(lái)下載哪些URL對應哪些網(wǎng)頁(yè);
  提取器和 DNS 解析器
  這兩個(gè)模塊是兩個(gè)非常簡(jiǎn)單的獨立服務(wù):DNS Resolver負責域名解析;fetcher的輸入是域名解析后的url,返回的是url對應的網(wǎng)頁(yè)內容。對于任何網(wǎng)頁(yè)抓取,都需要調用這兩個(gè)模塊。
  對于一般的爬蟲(chóng)來(lái)說(shuō),這兩個(gè)模塊可以做得很簡(jiǎn)單,甚至可以合并在一起。但是對于具有高性能要求的系統,它們可能成為潛在的性能瓶頸。主要原因是域名解析和爬取都是耗時(shí)的任務(wù)。比如抓取網(wǎng)頁(yè)時(shí),一般延遲在幾百毫秒。如果遇到慢網(wǎng)站,可能需要幾秒甚至十幾秒,會(huì )導致工作線(xiàn)程阻塞等待很長(cháng)時(shí)間。如果希望 Fetcher 能夠每秒下載數千頁(yè)或更多頁(yè)面,則需要啟動(dòng)大量工作線(xiàn)程。
  因此,對于性能要求較高的爬蟲(chóng)系統,一般采用epoll或類(lèi)似的技術(shù),將兩個(gè)模塊改成異步機制。另外,DNS解析的結果也被緩存,大大減少了DNS解析的操作。
  看到的內容
  互聯(lián)網(wǎng)上有些網(wǎng)站經(jīng)常有鏡像網(wǎng)站(鏡像),即兩個(gè)網(wǎng)站的內容相同但網(wǎng)頁(yè)對應的域名不同。這將導致多次重復爬取同一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。為了避免這種情況,對于每一個(gè)爬取的網(wǎng)頁(yè),首先需要進(jìn)入 Content Seen 模塊。模塊會(huì )判斷網(wǎng)頁(yè)內容與下載的網(wǎng)頁(yè)內容是否一致。如果它們一致,則不會(huì )發(fā)送網(wǎng)頁(yè)進(jìn)行進(jìn)一步處理。這種方法可以顯著(zhù)減少爬蟲(chóng)需要下載的網(wǎng)頁(yè)數量。
  至于判斷兩個(gè)網(wǎng)頁(yè)的內容是否一致,大致思路是這樣的:不是直接比較兩個(gè)網(wǎng)頁(yè)的內容,而是計算網(wǎng)頁(yè)的內容,生成一個(gè)FingerPrint(指紋),通常是一個(gè)指紋是固定長(cháng)度。該字符串比網(wǎng)頁(yè)的正文短得多。如果兩個(gè)網(wǎng)頁(yè)的指紋相同,則認為它們的內容相同。
  提取器和 URL 過(guò)濾器
  提取器的工作是從下載的網(wǎng)頁(yè)中提取它收錄的所有 URL。這是一項精細的工作,需要考慮所有可能的 url 樣式,例如網(wǎng)頁(yè)中往往收錄相對路徑 url,在提取時(shí)需要將其轉換為絕對路徑。
  Url Filter 是對提取的 url 進(jìn)行再次過(guò)濾。不同的應用有不同的篩選標準。比如baidu/google搜索一般不會(huì )被屏蔽,但是對于垂直搜索或者定向爬取的應用,可能只需要滿(mǎn)足一定條件的url,比如不需要圖片的url,比如只需要一個(gè)圖片的url需要具體的網(wǎng)站等。Url Filter是一個(gè)與應用密切相關(guān)的模塊。
  看到的網(wǎng)址
  Url Seen 用于對 url 進(jìn)行重復數據刪除。之前寫(xiě)過(guò)一篇關(guān)于url去重的博客,這里不再贅述。
  對于一個(gè)大型爬蟲(chóng)系統來(lái)說(shuō),它可能已經(jīng)有 100 億或 1000 億個(gè) URL。如何快速判斷是否出現了新的 URL 非常重要。因為大型爬蟲(chóng)系統可能在一秒鐘內下載數千個(gè)網(wǎng)頁(yè),一個(gè)網(wǎng)頁(yè)一般可以提取幾十個(gè)url,每個(gè)url都需要進(jìn)行去重操作??梢韵胂?,每秒需要執行大量的去重操作。. 因此 Url Seen 是整個(gè)爬蟲(chóng)系統中技術(shù)含量很高的部分。(Content Seen其實(shí)有這個(gè)問(wèn)題)
  網(wǎng)址集
  url經(jīng)過(guò)前面的一系列處理后,會(huì )被放入到Url Set中進(jìn)行調度獲取。由于 url 數量眾多,可能只有一小部分會(huì )放在內存中,而大部分會(huì )寫(xiě)入磁盤(pán)。通常,Url Set 的實(shí)現是一些文件或數據庫。
  網(wǎng)址邊界
  Frontier(不知道為什么叫這個(gè)名字)放在最后是因為它可以說(shuō)是整個(gè)爬蟲(chóng)系統的引擎和驅動(dòng),組織和調用其他模塊。
  當爬蟲(chóng)啟動(dòng)時(shí),Frontier 內部會(huì )有一些種子 url。它首先將種子url發(fā)送給Fetcher進(jìn)行抓取,然后將抓取的網(wǎng)頁(yè)發(fā)送給Extractor提取新的url,然后將新的url重放進(jìn)入Url Set;而當 Frontier 里面的 url 已經(jīng)被爬取完畢時(shí),它會(huì )從 Url Set 中提取那些沒(méi)有被爬取的新 url,如此循環(huán)往復。
  Frontier的調度實(shí)現有很多,這里只介紹最常用的實(shí)現方式。在此之前,需要稍微解釋一下。雖然我們在介紹 Fetcher 的時(shí)候說(shuō)過(guò),一個(gè)好的 Fetcher 每秒可以下載幾十萬(wàn)個(gè)網(wǎng)頁(yè),但是對于特定的目標 網(wǎng)站,比如爬蟲(chóng)系統會(huì )爬得很慢,而且只會(huì )每十秒被抓一次。這是為了確保目標 網(wǎng)站 不會(huì )被爬蟲(chóng)捕獲。
  為了做到這一點(diǎn),Frontier 內部對每個(gè)域名都有一個(gè)對應的 FIFO 隊列,該隊列存儲了域名下的 url。Frontier 每次都會(huì )從某個(gè)隊列中拉出一個(gè) url 進(jìn)行爬取。隊列將保存 Frontier 上次調用它的時(shí)間。如果時(shí)間距離已經(jīng)超過(guò)某個(gè)值,則可以再次調用隊列。
  Frontier 可能同時(shí)有上千個(gè)這樣的隊列,它會(huì )輪詢(xún)得到一個(gè)可以調用的隊列,然后從隊列中拉出一個(gè) url 去獲取。一旦隊列中的所有url都被消費到一定程度,Frontier就會(huì )從Url Set中抽取一批新的url,放入對應的隊列中。
  分散式
  當單機版爬蟲(chóng)性能不能滿(mǎn)足要求時(shí),應考慮使用多臺機器組成分布式爬蟲(chóng)系統。分布式爬蟲(chóng)架構其實(shí)比想象的要簡(jiǎn)單得多。一個(gè)簡(jiǎn)單的做法是:假設有N臺機器,每臺機器都有一個(gè)完整的爬蟲(chóng)系統在運行,每臺機器的爬蟲(chóng)都在從Extractor模塊中獲取新的信息。在url之后,根據url的域名進(jìn)行hash,然后取模N得到結果n,然后將url放入第n臺機器的Url Set中。這樣,不同的網(wǎng)站 URL就會(huì )在不同的機器上處理。
  以上是完整爬蟲(chóng)的系統實(shí)現。當然,由于篇幅限制,有些細節被省略了。例如,在爬取每個(gè)網(wǎng)站之前,爬蟲(chóng)需要讀取網(wǎng)站的robots.txt來(lái)判斷網(wǎng)站是否允許被爬?。ň〇|把robots. txt 前一段時(shí)間在 robots.txt 中)。一淘的爬蟲(chóng)被堵住了。需要注意的是robots.txt只是行業(yè)協(xié)議,在技術(shù)上不能強行拒絕爬蟲(chóng)的爬?。?;再例如,一些網(wǎng)站 提供站點(diǎn)地圖,它可以直接從站點(diǎn)地圖中獲取該網(wǎng)站 的所有url;等等。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度百科的歷史記錄,結果在時(shí)隔四個(gè)月之后再次遇到的對手)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 74 次瀏覽 ? 2022-02-06 01:03 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度百科的歷史記錄,結果在時(shí)隔四個(gè)月之后再次遇到的對手)
  動(dòng)態(tài)頁(yè)面爬取
  很久沒(méi)有寫(xiě)爬蟲(chóng)了。今天敲了一個(gè)爬蟲(chóng)——爬百度百科的歷史記錄。結果時(shí)隔四個(gè)月再次遇到的對手居然是動(dòng)態(tài)頁(yè)面(我一開(kāi)始覺(jué)得百度太簡(jiǎn)單了。),但經(jīng)過(guò)一番努力,還是達到了自己的目標,然后就寫(xiě)了博客作為評論。
  一、概念
  動(dòng)態(tài)頁(yè)面實(shí)際上是相對于靜態(tài)頁(yè)面的。面對靜態(tài)頁(yè)面時(shí),直接查看響應一般是網(wǎng)頁(yè)的整個(gè)代碼,而對于動(dòng)態(tài)頁(yè)面則不然。一般來(lái)說(shuō),當再次打開(kāi)動(dòng)態(tài)頁(yè)面的響應時(shí),會(huì )與您在網(wǎng)頁(yè)上看到的有所不同。
  二、練習和練習前
  因為我很喜歡練習,所以我會(huì )一言不發(fā)地練習,練習會(huì )給你真正的知識,你多練習就會(huì )明白。
  目標頁(yè)面:萬(wàn)科百度百科歷史版
  實(shí)現環(huán)境:win32
  版本:python 3.6.2
  實(shí)用目標:獲取萬(wàn)科百度百科歷史版的歷史修改時(shí)間,制作圖表或csv文件
  三、流程說(shuō)明
  和所有爬蟲(chóng)一樣,我們的第一步會(huì )是分析網(wǎng)頁(yè),因為我們的目標選擇的是動(dòng)態(tài)網(wǎng)頁(yè),所以我們還需要跟蹤json文件等等。
  過(guò)程:
  1、網(wǎng)頁(yè)分析
  2、查詢(xún)、跟蹤json等文件或xhr
  3、 用于文本匹配
  4、繪制或制作 csv
  四、工具準備
  我們需要的庫是(所有最新版本):
  1.請求
  2.回復
 ?。ㄒ韵聨鞂τ谂老x(chóng)來(lái)說(shuō)不是必需的,但它們是我這次需要的)
  3.matplotlib(用于可視化)
  4.datetime(準時(shí)運行)
  5.Pandas(python強大的數據處理庫)
  6.os(在系統上運行)
 ?。ㄎ腋矚g原來(lái)的re庫,當然這里使用正則表達式可以解決所有問(wèn)題)
  你需要知道的:
  1.python 語(yǔ)法基礎
  2.正則表達式匹配規則
 ?。ㄅ佬袆?dòng)物不需要以下內容)
  3.datetime 一些基本函數
  4.Matplotlib 可視化操作(雖然這對于非爬蟲(chóng)來(lái)說(shuō)是必須的,但很多情況下數據可視化會(huì )讓數據更直觀(guān),更容易做出判斷)
  5.pandas庫的基本使用(非爬蟲(chóng)必備,數據分析必備)
  五、網(wǎng)頁(yè)分析
  首先我們打開(kāi)我們的目標頁(yè)面→萬(wàn)科百度百科歷史版。
  好像一切正??常,然后我們查看url,也有前面提到的規則,但是真的一切正常嗎?
  如果你把這個(gè)頁(yè)面做為靜態(tài)頁(yè)面,那肯定是注定要失敗的,因為我從一開(kāi)始就是這樣做的,當你在第一頁(yè)查找代碼時(shí),你會(huì )發(fā)現一切正常,但是當你在第二頁(yè)查找代碼時(shí)page 有時(shí),您會(huì )發(fā)現一個(gè)事實(shí),即您在第二頁(yè)甚至最后一頁(yè)上看到的最后一個(gè)代碼是相同的。你覺(jué)得這有悖常理嗎?
  六、關(guān)注
  事實(shí)上,事實(shí)并非如此。這是正常的事情。很多頁(yè)面會(huì )做成動(dòng)態(tài)的,使用json或者其他文件來(lái)傳輸數據(不準確,也可能使用java、JavaScript等代碼調用端口等),這樣比較安全。
  此時(shí)很多人會(huì )選擇使用fiddle等第三方軟件抓包,比較方便,但是這里筆者比較難,所以直接在控制器平臺上觀(guān)看即可。
  經(jīng)過(guò)一番搜索,我們鎖定了幾個(gè)我們需要的文件和 xhr 文件。
  很多網(wǎng)頁(yè)的數據都會(huì )隱藏在json中。這可能是一樣的嗎?當然檢查后失敗了,然后我們看xhr,發(fā)現這個(gè)很熟悉的字段(當然我可能很熟悉)
  顯而易見(jiàn)的答案就在這里,只需解釋一下
  獲取歷史列表,獲取歷史數據
  我猜這個(gè)東西是萬(wàn)科的quantio語(yǔ)句(不知道這個(gè)詞是不是拼錯了,不過(guò)我用的很少,前后端工作的朋友可能知道)
  Lemmald,這不就是萬(wàn)科在百度的號碼嗎?
  一看就知道是第七頁(yè)
  大小顯示 25 條消息
  這個(gè)發(fā)現很棒,解決了很多問(wèn)題。
  七、假的
  作為爬蟲(chóng),了解反爬蟲(chóng)套路是非常有必要的。如果你在xhr上進(jìn)行正常爬蟲(chóng),你會(huì )發(fā)現返回給你的是{error: xxxxx},此時(shí)你應該警惕,這證明你的機器人的身份被百度識破了,它拒絕了給你數據,所以我們需要做一些簡(jiǎn)單的偽裝。前面已經(jīng)講過(guò)改頭文件了,這次我會(huì )多講。
  1.headers 偽裝,服務(wù)器使用它來(lái)確定您正在使用的瀏覽器。當出現這種情況時(shí),服務(wù)器會(huì )認為這是來(lái)自瀏覽器的正常請求。
  2.Referer:瀏覽器使用它來(lái)確定您從哪個(gè)網(wǎng)頁(yè)跳轉。
  3.ip偽裝,這個(gè)只要構造好ip池就沒(méi)有問(wèn)題。
  4.cookie偽裝,cookie被服務(wù)器用來(lái)識別你當前的狀態(tài),比如你是否已經(jīng)登錄等。每次你向服務(wù)器請求cookie時(shí),都會(huì )相應更新。
  最常用的就是上面這些了,從上到下越來(lái)越難調整了。面對百度,光改headers顯然是不夠的,于是加了Referer和cookie碼(關(guān)鍵是兩個(gè)月前就建立了。IP池已經(jīng)廢掉了,懶得整)。
  好了,到這里我們發(fā)現可以正常獲取數據了。
  八、文本匹配
  不得不說(shuō),在解決了以上問(wèn)題之后,文本匹配就變成了最簡(jiǎn)單的事情。
  其實(shí)這是一種類(lèi)似字典的格式,但是作者懶得想了,決定用一個(gè)簡(jiǎn)單粗暴的正則表達式。
  九、轉換時(shí)間戳
  這時(shí)候我們就會(huì )發(fā)現,creattime給出的時(shí)間到底是什么鬼?
  但如果你仔細想想,你會(huì )發(fā)現它是一個(gè)時(shí)間戳
  python 中的時(shí)間戳:自 1/1/1970 12:00AM 以來(lái)的秒數
  是不是很破?
  幸運的是,解決這個(gè)問(wèn)題只需要幾段簡(jiǎn)短的代碼
  輸入時(shí)間戳,好了,問(wèn)題解決了。
  十、繪圖和csv
  圖片
  CSV
  十個(gè)一、總結和代碼
  感覺(jué)這次爬蟲(chóng)還行。兩個(gè)多月后想起來(lái)也不容易。寫(xiě)這個(gè)博客純粹是一個(gè)評論。至于怎么做圖和怎么做csv的原因,我可以說(shuō)博主是不是突然不想寫(xiě)了?
  這是代碼:
 ?。ㄗⅲ翰┲鲬械脤?xiě)評論了,不明白的可以評論提問(wèn),謝謝)
  ———————————————
  版權聲明:本文為CSDN博主“獨孤天”的原創(chuàng )文章,遵循CC4.0 BY-SA版權協(xié)議。轉載請附上原文出處鏈接和本聲明。
  原文鏈接: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度百科的歷史記錄,結果在時(shí)隔四個(gè)月之后再次遇到的對手)
  動(dòng)態(tài)頁(yè)面爬取
  很久沒(méi)有寫(xiě)爬蟲(chóng)了。今天敲了一個(gè)爬蟲(chóng)——爬百度百科的歷史記錄。結果時(shí)隔四個(gè)月再次遇到的對手居然是動(dòng)態(tài)頁(yè)面(我一開(kāi)始覺(jué)得百度太簡(jiǎn)單了。),但經(jīng)過(guò)一番努力,還是達到了自己的目標,然后就寫(xiě)了博客作為評論。
  一、概念
  動(dòng)態(tài)頁(yè)面實(shí)際上是相對于靜態(tài)頁(yè)面的。面對靜態(tài)頁(yè)面時(shí),直接查看響應一般是網(wǎng)頁(yè)的整個(gè)代碼,而對于動(dòng)態(tài)頁(yè)面則不然。一般來(lái)說(shuō),當再次打開(kāi)動(dòng)態(tài)頁(yè)面的響應時(shí),會(huì )與您在網(wǎng)頁(yè)上看到的有所不同。
  二、練習和練習前
  因為我很喜歡練習,所以我會(huì )一言不發(fā)地練習,練習會(huì )給你真正的知識,你多練習就會(huì )明白。
  目標頁(yè)面:萬(wàn)科百度百科歷史版
  實(shí)現環(huán)境:win32
  版本:python 3.6.2
  實(shí)用目標:獲取萬(wàn)科百度百科歷史版的歷史修改時(shí)間,制作圖表或csv文件
  三、流程說(shuō)明
  和所有爬蟲(chóng)一樣,我們的第一步會(huì )是分析網(wǎng)頁(yè),因為我們的目標選擇的是動(dòng)態(tài)網(wǎng)頁(yè),所以我們還需要跟蹤json文件等等。
  過(guò)程:
  1、網(wǎng)頁(yè)分析
  2、查詢(xún)、跟蹤json等文件或xhr
  3、 用于文本匹配
  4、繪制或制作 csv
  四、工具準備
  我們需要的庫是(所有最新版本):
  1.請求
  2.回復
 ?。ㄒ韵聨鞂τ谂老x(chóng)來(lái)說(shuō)不是必需的,但它們是我這次需要的)
  3.matplotlib(用于可視化)
  4.datetime(準時(shí)運行)
  5.Pandas(python強大的數據處理庫)
  6.os(在系統上運行)
 ?。ㄎ腋矚g原來(lái)的re庫,當然這里使用正則表達式可以解決所有問(wèn)題)
  你需要知道的:
  1.python 語(yǔ)法基礎
  2.正則表達式匹配規則
 ?。ㄅ佬袆?dòng)物不需要以下內容)
  3.datetime 一些基本函數
  4.Matplotlib 可視化操作(雖然這對于非爬蟲(chóng)來(lái)說(shuō)是必須的,但很多情況下數據可視化會(huì )讓數據更直觀(guān),更容易做出判斷)
  5.pandas庫的基本使用(非爬蟲(chóng)必備,數據分析必備)
  五、網(wǎng)頁(yè)分析
  首先我們打開(kāi)我們的目標頁(yè)面→萬(wàn)科百度百科歷史版。
  好像一切正??常,然后我們查看url,也有前面提到的規則,但是真的一切正常嗎?
  如果你把這個(gè)頁(yè)面做為靜態(tài)頁(yè)面,那肯定是注定要失敗的,因為我從一開(kāi)始就是這樣做的,當你在第一頁(yè)查找代碼時(shí),你會(huì )發(fā)現一切正常,但是當你在第二頁(yè)查找代碼時(shí)page 有時(shí),您會(huì )發(fā)現一個(gè)事實(shí),即您在第二頁(yè)甚至最后一頁(yè)上看到的最后一個(gè)代碼是相同的。你覺(jué)得這有悖常理嗎?
  六、關(guān)注
  事實(shí)上,事實(shí)并非如此。這是正常的事情。很多頁(yè)面會(huì )做成動(dòng)態(tài)的,使用json或者其他文件來(lái)傳輸數據(不準確,也可能使用java、JavaScript等代碼調用端口等),這樣比較安全。
  此時(shí)很多人會(huì )選擇使用fiddle等第三方軟件抓包,比較方便,但是這里筆者比較難,所以直接在控制器平臺上觀(guān)看即可。
  經(jīng)過(guò)一番搜索,我們鎖定了幾個(gè)我們需要的文件和 xhr 文件。
  很多網(wǎng)頁(yè)的數據都會(huì )隱藏在json中。這可能是一樣的嗎?當然檢查后失敗了,然后我們看xhr,發(fā)現這個(gè)很熟悉的字段(當然我可能很熟悉)
  顯而易見(jiàn)的答案就在這里,只需解釋一下
  獲取歷史列表,獲取歷史數據
  我猜這個(gè)東西是萬(wàn)科的quantio語(yǔ)句(不知道這個(gè)詞是不是拼錯了,不過(guò)我用的很少,前后端工作的朋友可能知道)
  Lemmald,這不就是萬(wàn)科在百度的號碼嗎?
  一看就知道是第七頁(yè)
  大小顯示 25 條消息
  這個(gè)發(fā)現很棒,解決了很多問(wèn)題。
  七、假的
  作為爬蟲(chóng),了解反爬蟲(chóng)套路是非常有必要的。如果你在xhr上進(jìn)行正常爬蟲(chóng),你會(huì )發(fā)現返回給你的是{error: xxxxx},此時(shí)你應該警惕,這證明你的機器人的身份被百度識破了,它拒絕了給你數據,所以我們需要做一些簡(jiǎn)單的偽裝。前面已經(jīng)講過(guò)改頭文件了,這次我會(huì )多講。
  1.headers 偽裝,服務(wù)器使用它來(lái)確定您正在使用的瀏覽器。當出現這種情況時(shí),服務(wù)器會(huì )認為這是來(lái)自瀏覽器的正常請求。
  2.Referer:瀏覽器使用它來(lái)確定您從哪個(gè)網(wǎng)頁(yè)跳轉。
  3.ip偽裝,這個(gè)只要構造好ip池就沒(méi)有問(wèn)題。
  4.cookie偽裝,cookie被服務(wù)器用來(lái)識別你當前的狀態(tài),比如你是否已經(jīng)登錄等。每次你向服務(wù)器請求cookie時(shí),都會(huì )相應更新。
  最常用的就是上面這些了,從上到下越來(lái)越難調整了。面對百度,光改headers顯然是不夠的,于是加了Referer和cookie碼(關(guān)鍵是兩個(gè)月前就建立了。IP池已經(jīng)廢掉了,懶得整)。
  好了,到這里我們發(fā)現可以正常獲取數據了。
  八、文本匹配
  不得不說(shuō),在解決了以上問(wèn)題之后,文本匹配就變成了最簡(jiǎn)單的事情。
  其實(shí)這是一種類(lèi)似字典的格式,但是作者懶得想了,決定用一個(gè)簡(jiǎn)單粗暴的正則表達式。
  九、轉換時(shí)間戳
  這時(shí)候我們就會(huì )發(fā)現,creattime給出的時(shí)間到底是什么鬼?
  但如果你仔細想想,你會(huì )發(fā)現它是一個(gè)時(shí)間戳
  python 中的時(shí)間戳:自 1/1/1970 12:00AM 以來(lái)的秒數
  是不是很破?
  幸運的是,解決這個(gè)問(wèn)題只需要幾段簡(jiǎn)短的代碼
  輸入時(shí)間戳,好了,問(wèn)題解決了。
  十、繪圖和csv
  圖片
  CSV
  十個(gè)一、總結和代碼
  感覺(jué)這次爬蟲(chóng)還行。兩個(gè)多月后想起來(lái)也不容易。寫(xiě)這個(gè)博客純粹是一個(gè)評論。至于怎么做圖和怎么做csv的原因,我可以說(shuō)博主是不是突然不想寫(xiě)了?
  這是代碼:
 ?。ㄗⅲ翰┲鲬械脤?xiě)評論了,不明白的可以評論提問(wèn),謝謝)
  ———————————————
  版權聲明:本文為CSDN博主“獨孤天”的原創(chuàng )文章,遵循CC4.0 BY-SA版權協(xié)議。轉載請附上原文出處鏈接和本聲明。
  原文鏈接:

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度貼模塊詳細解析(一)_社會(huì )萬(wàn)象_光明網(wǎng) )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 85 次瀏覽 ? 2022-02-05 23:19 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度貼模塊詳細解析(一)_社會(huì )萬(wàn)象_光明網(wǎng)
)
  目錄概覽
  爬取百度貼吧每篇博文的所有圖片。
  準備所需模塊,涉及知識點(diǎn),運行效果
  控制臺打?。?br />   
  計算機本地文件:
  
  完成爬蟲(chóng)1.分析網(wǎng)頁(yè)
  打開(kāi)百度貼吧搜索關(guān)鍵字,這里的例子是python,也可以是其他關(guān)鍵字
  分析前三個(gè)頁(yè)面的url,得到:
  # 第1頁(yè):http://tieba.baidu.com/f%3Fkw% ... n%3D0
# 第2頁(yè):http://tieba.baidu.com/f%3Fkw% ... %3D50
# 第3頁(yè):http://tieba.baidu.com/f%3Fkw% ... 3D100
# 比較三者三者可以得出每一頁(yè)的網(wǎng)址公式:
# "http://tieba.baidu.com/f%3Fkw% ... 3B%2B(page_index-1)*50
# 其中tieba_name是你要搜索的貼吧名字,page_index是你要搜索的第幾頁(yè)
  得到每個(gè)頁(yè)面的URL后,下一步就是分析每個(gè)帖子在特定頁(yè)面上的鏈接:
  
  已經(jīng)可以通過(guò)頁(yè)面的 URL 請求源代碼。在源碼中,可以通過(guò)xpath表達式提取出一串數字,然后組裝出具體帖子頁(yè)面的URL。
  點(diǎn)擊帖子進(jìn)入具體頁(yè)面,索取源碼然后提取圖片鏈接:
  
  這樣想:
  首先根據貼吧的名字獲取貼吧的URL,然后組裝各個(gè)頁(yè)面的URL,然后根據各個(gè)頁(yè)面的URL請求頁(yè)面的HTML源代碼,然后在源碼中提取每個(gè)帖子的URL超鏈接信息,然后組裝帖子每個(gè)具體頁(yè)面的URL,然后請求帖子具體頁(yè)面的HMTL源代碼,提取圖片的超鏈接,然后根據圖片的超鏈接下載圖片。
  2.爬蟲(chóng)代碼
  import urllib.parse
import urllib.request
from lxml import etree
# 爬蟲(chóng)實(shí)踐:爬取百度貼吧的圖片
class Spider():
def __init__(self):
self.tiebaName = "java"
self.pageNumber = 3
self.url = "http://tieba.baidu.com/f?"
self.fileName = 1
def tiebaSpider(self):
"""構造URL"""
for page_index in range(1, self.pageNumber + 1):
pn = (page_index - 1) * 50
wo = {"pn": pn, "kw": self.tiebaName}
word = urllib.parse.urlencode(wo)
tieba_url = self.url + word
self.loadPage(tieba_url)
def loadPage(self, url):
"""爬取頁(yè)面內容"""
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//div[@class=&#39;threadlist_lz clearfix&#39;]/div/a/@href")
for link in links:
link = "http://tieba.baidu.com" + link
self.loadImages(link)
def loadImages(self, link):
"""爬取帖子詳情頁(yè),獲得圖片的鏈接"""
req = urllib.request.Request(link)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//img[@class=&#39;BDE_Image&#39;]/@src")
for image_link in links:
self.writeImages(image_link)
def writeImages(self, imageslink):
"""通過(guò)圖片的鏈接,爬取圖片并保存在本地"""
print("正在存儲圖片:", self.fileName, "......")
image = urllib.request.urlopen(imageslink).read()
file = open(r"C:\\Users\\Administrator\\Pictures\\img\\" + str(self.fileName) + ".jpg", "wb")
file.write(image)
file.close()
self.fileName += 1
if __name__ == &#39;__main__&#39;:
# 實(shí)例化Spider類(lèi)
mySpider = Spider()
# 調用方法
mySpider.tiebaSpider() 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬取百度貼模塊詳細解析(一)_社會(huì )萬(wàn)象_光明網(wǎng)
)
  目錄概覽
  爬取百度貼吧每篇博文的所有圖片。
  準備所需模塊,涉及知識點(diǎn),運行效果
  控制臺打?。?br />   
  計算機本地文件:
  
  完成爬蟲(chóng)1.分析網(wǎng)頁(yè)
  打開(kāi)百度貼吧搜索關(guān)鍵字,這里的例子是python,也可以是其他關(guān)鍵字
  分析前三個(gè)頁(yè)面的url,得到:
  # 第1頁(yè):http://tieba.baidu.com/f%3Fkw% ... n%3D0
# 第2頁(yè):http://tieba.baidu.com/f%3Fkw% ... %3D50
# 第3頁(yè):http://tieba.baidu.com/f%3Fkw% ... 3D100
# 比較三者三者可以得出每一頁(yè)的網(wǎng)址公式:
# "http://tieba.baidu.com/f%3Fkw% ... 3B%2B(page_index-1)*50
# 其中tieba_name是你要搜索的貼吧名字,page_index是你要搜索的第幾頁(yè)
  得到每個(gè)頁(yè)面的URL后,下一步就是分析每個(gè)帖子在特定頁(yè)面上的鏈接:
  
  已經(jīng)可以通過(guò)頁(yè)面的 URL 請求源代碼。在源碼中,可以通過(guò)xpath表達式提取出一串數字,然后組裝出具體帖子頁(yè)面的URL。
  點(diǎn)擊帖子進(jìn)入具體頁(yè)面,索取源碼然后提取圖片鏈接:
  
  這樣想:
  首先根據貼吧的名字獲取貼吧的URL,然后組裝各個(gè)頁(yè)面的URL,然后根據各個(gè)頁(yè)面的URL請求頁(yè)面的HTML源代碼,然后在源碼中提取每個(gè)帖子的URL超鏈接信息,然后組裝帖子每個(gè)具體頁(yè)面的URL,然后請求帖子具體頁(yè)面的HMTL源代碼,提取圖片的超鏈接,然后根據圖片的超鏈接下載圖片。
  2.爬蟲(chóng)代碼
  import urllib.parse
import urllib.request
from lxml import etree
# 爬蟲(chóng)實(shí)踐:爬取百度貼吧的圖片
class Spider():
def __init__(self):
self.tiebaName = "java"
self.pageNumber = 3
self.url = "http://tieba.baidu.com/f?"
self.fileName = 1
def tiebaSpider(self):
"""構造URL"""
for page_index in range(1, self.pageNumber + 1):
pn = (page_index - 1) * 50
wo = {"pn": pn, "kw": self.tiebaName}
word = urllib.parse.urlencode(wo)
tieba_url = self.url + word
self.loadPage(tieba_url)
def loadPage(self, url):
"""爬取頁(yè)面內容"""
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//div[@class=&#39;threadlist_lz clearfix&#39;]/div/a/@href")
for link in links:
link = "http://tieba.baidu.com" + link
self.loadImages(link)
def loadImages(self, link):
"""爬取帖子詳情頁(yè),獲得圖片的鏈接"""
req = urllib.request.Request(link)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//img[@class=&#39;BDE_Image&#39;]/@src")
for image_link in links:
self.writeImages(image_link)
def writeImages(self, imageslink):
"""通過(guò)圖片的鏈接,爬取圖片并保存在本地"""
print("正在存儲圖片:", self.fileName, "......")
image = urllib.request.urlopen(imageslink).read()
file = open(r"C:\\Users\\Administrator\\Pictures\\img\\" + str(self.fileName) + ".jpg", "wb")
file.write(image)
file.close()
self.fileName += 1
if __name__ == &#39;__main__&#39;:
# 實(shí)例化Spider類(lèi)
mySpider = Spider()
# 調用方法
mySpider.tiebaSpider()

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(項目工具Python3.7.1、JetBrainsPyCharm三、項目過(guò)程(四))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 87 次瀏覽 ? 2022-02-05 03:09 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(項目工具Python3.7.1、JetBrainsPyCharm三、項目過(guò)程(四))
  需要編寫(xiě)的程序可以在任意一個(gè)貼吧頁(yè)面獲取帖子鏈接,抓取用戶(hù)在帖子中發(fā)布的圖片。在這個(gè)過(guò)程中,通過(guò)用戶(hù)代理進(jìn)行偽裝和輪換,解決了爬蟲(chóng)ip被目標網(wǎng)站封禁的問(wèn)題。熟悉基本的網(wǎng)頁(yè)和url分析,能靈活使用Xmind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖。
  一、項目分析
  1. 網(wǎng)絡(luò )分析
  貼吧頁(yè)面簡(jiǎn)潔,所有內容一目了然,比其他社區論壇更容易使用。注冊容易,甚至不注冊,發(fā)布也容易。但是,欄目創(chuàng )建不均,內容五花八門(mén)。
  2. 網(wǎng)址解析
  分析貼吧中post鏈接的拼接形式,在程序中重構post鏈接。
  比如在本例的實(shí)驗中,多次輸入不同的貼吧后,可以看出貼吧的鏈接組成為:fullurl=url+key。其中 fullurl 表示 貼吧 總鏈接
  url為貼吧鏈接的社區:
  關(guān)鍵是urlencode編碼的貼吧中文名
  使用 xpath_helper_2_0_2.crx 瀏覽器插件,帖子的鏈接條目可以歸結為:
  "//li/div[@class="t_con cleafix"]/div/div/div/a/@href",用戶(hù)在帖子中張貼的圖片鏈接表達式為:"//img··[@class = "BDE_Image"]/@src"
  二、項目工具
  Python 3.7.1,JetBrains PyCharm 2018.3.2
  三、項目流程
 ?。ㄒ唬┦褂肵mind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖,繪制程序邏輯框架圖如圖4-1
  
  圖 4-1 程序邏輯框架圖
 ?。ǘ┡老x(chóng)調試過(guò)程的Bug描述(截圖)
  
  (三)爬蟲(chóng)運行結果
  
  
  (四)項目經(jīng)歷
  本次實(shí)驗的經(jīng)驗總結如下:
  1、 當程序運行結果提示錯誤:ModuleNotFoundError: No module named 'lxml'時(shí),最好的解決辦法是先檢查lxml是否安裝,再檢查lxml是否導入。在本次實(shí)驗中,由于項目可以成功導入lxml,解決方案如圖5-1所示。在“Project Interperter”中選擇python安裝目錄。
  
  圖 5-1 錯誤解決流程
  2、 有時(shí)候需要模擬瀏覽器,否則做過(guò)反爬的網(wǎng)站 會(huì )知道你是機器人
  例如,對于瀏覽器的限制,我們可以設置 User-Agent 頭。對于防盜鏈限制,我們可以設置Referer頭。一些網(wǎng)站使用cookies進(jìn)行限制,主要涉及登錄和限流。沒(méi)有通用的方法,只看能不能自動(dòng)登錄或者分析cookies的問(wèn)題。
  3、 第一步,我們可以從主界面的html代碼中提取出這組圖片的鏈接地址。顯然,我們需要使用正則表達式來(lái)提取這些不同的地址。然后,有了每組圖片的起始地址后,我們進(jìn)入子頁(yè)面,刷新網(wǎng)頁(yè),觀(guān)察它的加載過(guò)程。
  四、項目源碼
  貼吧pic.py
  from urllib import request,parse
import ssl
import random
import time
from lxml import etree
ua_list=[
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;,
&#39;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)&#39;,
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
]
def loadPage(url):
userAgent=random.choice(ua_list)
headers={"User-Agent":userAgent}
req =request.Request(url,headers=headers)
context=ssl._create_unverified_context()
response=request.urlopen(req,context=context)
html=response.read()
content=etree.HTML(html)
link_list=content.xpath(&#39;//li/div[@class="t_con cleafix"]/div/div/div/a/@href&#39;)
for link in link_list:
fullurl=&#39;http://tieba.baidu.com&#39;+link
print(fullurl)
loadImge(fullurl)
def loadImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
html = response.read()
content = etree.HTML(html)
link_list = content.xpath(&#39;//img[@class="BDE_Image"]/@src&#39;)
for link in link_list:
print(link)
writeImge(link)
def writeImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
image = response.read()
filename=url[-12:]
f=open(filename,&#39;wb&#39;)
f.write(image)
f.close()
def tiebaSpider(url,beginPage,endPage):
for page in range(beginPage,endPage+100):
pn=(page-1)*50
fullurl=url+"&pn="+str(pn)
loadPage(fullurl)
if __name__=="__main__":
print("測試成功!")
kw=input("請輸入要爬的貼吧名:")
beginPage=int(input("請輸入開(kāi)始頁(yè):"))
endPage = int(input("請輸入結束頁(yè):"))
url="http://tieba.baidu.com/f?"
key=parse.urlencode({"kw":kw})
fullurl=url+key
tiebaSpider(fullurl,beginPage,endPage)
  轉載于: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(項目工具Python3.7.1、JetBrainsPyCharm三、項目過(guò)程(四))
  需要編寫(xiě)的程序可以在任意一個(gè)貼吧頁(yè)面獲取帖子鏈接,抓取用戶(hù)在帖子中發(fā)布的圖片。在這個(gè)過(guò)程中,通過(guò)用戶(hù)代理進(jìn)行偽裝和輪換,解決了爬蟲(chóng)ip被目標網(wǎng)站封禁的問(wèn)題。熟悉基本的網(wǎng)頁(yè)和url分析,能靈活使用Xmind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖。
  一、項目分析
  1. 網(wǎng)絡(luò )分析
  貼吧頁(yè)面簡(jiǎn)潔,所有內容一目了然,比其他社區論壇更容易使用。注冊容易,甚至不注冊,發(fā)布也容易。但是,欄目創(chuàng )建不均,內容五花八門(mén)。
  2. 網(wǎng)址解析
  分析貼吧中post鏈接的拼接形式,在程序中重構post鏈接。
  比如在本例的實(shí)驗中,多次輸入不同的貼吧后,可以看出貼吧的鏈接組成為:fullurl=url+key。其中 fullurl 表示 貼吧 總鏈接
  url為貼吧鏈接的社區:
  關(guān)鍵是urlencode編碼的貼吧中文名
  使用 xpath_helper_2_0_2.crx 瀏覽器插件,帖子的鏈接條目可以歸結為:
  "//li/div[@class="t_con cleafix"]/div/div/div/a/@href",用戶(hù)在帖子中張貼的圖片鏈接表達式為:"//img··[@class = "BDE_Image"]/@src"
  二、項目工具
  Python 3.7.1,JetBrains PyCharm 2018.3.2
  三、項目流程
 ?。ㄒ唬┦褂肵mind工具分析Python爬蟲(chóng)(網(wǎng)絡(luò )爬蟲(chóng))的流程圖,繪制程序邏輯框架圖如圖4-1
  
  圖 4-1 程序邏輯框架圖
 ?。ǘ┡老x(chóng)調試過(guò)程的Bug描述(截圖)
  
  (三)爬蟲(chóng)運行結果
  
  
  (四)項目經(jīng)歷
  本次實(shí)驗的經(jīng)驗總結如下:
  1、 當程序運行結果提示錯誤:ModuleNotFoundError: No module named 'lxml'時(shí),最好的解決辦法是先檢查lxml是否安裝,再檢查lxml是否導入。在本次實(shí)驗中,由于項目可以成功導入lxml,解決方案如圖5-1所示。在“Project Interperter”中選擇python安裝目錄。
  
  圖 5-1 錯誤解決流程
  2、 有時(shí)候需要模擬瀏覽器,否則做過(guò)反爬的網(wǎng)站 會(huì )知道你是機器人
  例如,對于瀏覽器的限制,我們可以設置 User-Agent 頭。對于防盜鏈限制,我們可以設置Referer頭。一些網(wǎng)站使用cookies進(jìn)行限制,主要涉及登錄和限流。沒(méi)有通用的方法,只看能不能自動(dòng)登錄或者分析cookies的問(wèn)題。
  3、 第一步,我們可以從主界面的html代碼中提取出這組圖片的鏈接地址。顯然,我們需要使用正則表達式來(lái)提取這些不同的地址。然后,有了每組圖片的起始地址后,我們進(jìn)入子頁(yè)面,刷新網(wǎng)頁(yè),觀(guān)察它的加載過(guò)程。
  四、項目源碼
  貼吧pic.py
  from urllib import request,parse
import ssl
import random
import time
from lxml import etree
ua_list=[
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;,
&#39;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)&#39;,
&#39;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0&#39;
]
def loadPage(url):
userAgent=random.choice(ua_list)
headers={"User-Agent":userAgent}
req =request.Request(url,headers=headers)
context=ssl._create_unverified_context()
response=request.urlopen(req,context=context)
html=response.read()
content=etree.HTML(html)
link_list=content.xpath(&#39;//li/div[@class="t_con cleafix"]/div/div/div/a/@href&#39;)
for link in link_list:
fullurl=&#39;http://tieba.baidu.com&#39;+link
print(fullurl)
loadImge(fullurl)
def loadImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
html = response.read()
content = etree.HTML(html)
link_list = content.xpath(&#39;//img[@class="BDE_Image"]/@src&#39;)
for link in link_list:
print(link)
writeImge(link)
def writeImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
image = response.read()
filename=url[-12:]
f=open(filename,&#39;wb&#39;)
f.write(image)
f.close()
def tiebaSpider(url,beginPage,endPage):
for page in range(beginPage,endPage+100):
pn=(page-1)*50
fullurl=url+"&pn="+str(pn)
loadPage(fullurl)
if __name__=="__main__":
print("測試成功!")
kw=input("請輸入要爬的貼吧名:")
beginPage=int(input("請輸入開(kāi)始頁(yè):"))
endPage = int(input("請輸入結束頁(yè):"))
url="http://tieba.baidu.com/f?"
key=parse.urlencode({"kw":kw})
fullurl=url+key
tiebaSpider(fullurl,beginPage,endPage)
  轉載于:

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬蟲(chóng)的爬取步驟:具體的步驟-爬蟲(chóng)知乎圖片 )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 83 次瀏覽 ? 2022-02-04 10:11 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬蟲(chóng)的爬取步驟:具體的步驟-爬蟲(chóng)知乎圖片
)
  爬蟲(chóng)的爬取步驟:具體步驟:代碼示例:
  headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')
targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')
復制代碼
  完整代碼:
  這是一個(gè)爬取知乎圖片的教程代碼,涉及到代理ip文件(IP.txt)
  import requests,random,os,time
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
#獲取IP列表并檢驗IP的有效性
def get_ip_list():
f=open('IP.txt','r')
ip_list=f.readlines()
f.close()
return ip_list

#從IP列表中獲取隨機IP
def get_random_ip(ip_list):
proxy_ip = random.choice(ip_list)
proxy_ip=proxy_ip.strip('\n')
proxies = {'https': proxy_ip}
return proxies

def get_picture(url,ip_list):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')

targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')

#保存圖片鏈接
list_url = []
for each in targets_url:
list_url.append(each.img.get('src'))

for each_img in list_url:
#判斷文件夾(圖庫)是否存在,若不存在則創(chuàng )建文件夾
if '圖庫' not in os.listdir():
os.makedirs('圖庫')
#下載圖片
proxies = get_random_ip(ip_list)
picture = '%s.jpg' % time.time()
req = requests.get(url=each_img,headers=headers,proxies=proxies)
with open('圖庫/{}.jpg'.format(picture),'wb') as f:
f.write(req.content)
#每爬取一張圖片暫停一秒防止ip被封
time.sleep(1)
print('{}下載完成!'.format(picture))

def main():
ip_list = get_ip_list()
url = 'https://www.zhihu.com/question/22918070'
get_picture(url,ip_list)

if __name__ == '__main__':
main()
復制代碼
  成功后截圖:
  
  爬行動(dòng)物簡(jiǎn)介:
  網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛,是一種用于自動(dòng)瀏覽萬(wàn)維網(wǎng)的網(wǎng)絡(luò )機器人。Web 爬蟲(chóng)從稱(chēng)為種子的統一資源地址 (URL) 列表開(kāi)始。當網(wǎng)絡(luò )爬蟲(chóng)訪(fǎng)問(wèn)這些統一的資源定位器時(shí),它們會(huì )識別頁(yè)面上的所有超鏈接,并將它們寫(xiě)入一個(gè)“訪(fǎng)問(wèn)列表”,即所謂的爬取域。此域上的 URL 將根據一組策略以循環(huán)方式訪(fǎng)問(wèn)。如果爬蟲(chóng)在執行過(guò)程中復制存檔上的信息并保存網(wǎng)站,這些存檔通常會(huì )被存儲起來(lái),以便于查看。閱讀和瀏覽他們存儲在 網(wǎng)站 上的信息并立即更新。這些存儲的網(wǎng)頁(yè)也稱(chēng)為“快照”。較大的網(wǎng)頁(yè)意味著(zhù)網(wǎng)絡(luò )爬蟲(chóng)在給定時(shí)間內只能下載網(wǎng)頁(yè)的較小部分,因此優(yōu)先下載。高變化率意味著(zhù)頁(yè)面可能已被更新或替換。一些服務(wù)器端軟件生成的 URL(統一資源定位器)也使網(wǎng)絡(luò )爬蟲(chóng)難以避免檢索重復的內容。(來(lái)自:維基百科)
  通過(guò)代碼訪(fǎng)問(wèn)網(wǎng)頁(yè)并將頁(yè)面內容保存在本地。url是爬蟲(chóng)識別網(wǎng)頁(yè)的重要標識。通過(guò)requests.get(url)獲取網(wǎng)頁(yè)的HTML代碼,通過(guò)BeautifulSoup解析HTML文件得到我們需要的內容。find()/find_all() 是 beautifulSoup 的兩個(gè)重要方法。
  補充知識點(diǎn):
  關(guān)于爬蟲(chóng)中的headers:在使用python爬蟲(chóng)爬取數據時(shí),我們經(jīng)常會(huì )遇到一些網(wǎng)站的反爬蟲(chóng)措施,一般都是針對headers中的User-Agent。如果不設置headers,User-Agent會(huì )聲明它是python腳本,如果網(wǎng)站有反爬蟲(chóng)的想法,必然會(huì )拒絕這樣的連接。通過(guò)修改headers,可以將自己的爬蟲(chóng)腳本偽裝成瀏覽器的正常訪(fǎng)問(wèn)來(lái)避免這個(gè)問(wèn)題。
  關(guān)于爬蟲(chóng)中的IP/代理: 設置好用戶(hù)代理后,應該考慮另一個(gè)問(wèn)題。程序的運行速度非???。如果我們使用爬蟲(chóng)程序來(lái)爬取網(wǎng)站中的東西,一個(gè)固定IP的訪(fǎng)問(wèn)頻率會(huì )很高,不符合人工操作的標準,因為人工操作不可能在內部進(jìn)行如此頻繁的訪(fǎng)問(wèn)幾毫秒。所以有些網(wǎng)站會(huì )設置IP訪(fǎng)問(wèn)頻率的閾值。如果某個(gè)IP的訪(fǎng)問(wèn)頻率超過(guò)了這個(gè)閾值,則說(shuō)明這不是人在訪(fǎng)問(wèn),而是爬蟲(chóng)。因此,當我們需要爬取大量數據時(shí),一個(gè)不斷變化的IP機制是必不可少的。我的代碼中的 IP.txt 文件就是為此機制準備的。
  關(guān)于 BeautifulSoup: 簡(jiǎn)單來(lái)說(shuō),Beautiful Soup 是一個(gè) Python 庫,其主要功能是從網(wǎng)頁(yè)中抓取數據。
  BeautifulSoup 的安裝:
  pip install beautifulsoup4
復制代碼 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(爬蟲(chóng)的爬取步驟:具體的步驟-爬蟲(chóng)知乎圖片
)
  爬蟲(chóng)的爬取步驟:具體步驟:代碼示例:
  headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')
targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')
復制代碼
  完整代碼:
  這是一個(gè)爬取知乎圖片的教程代碼,涉及到代理ip文件(IP.txt)
  import requests,random,os,time
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
#獲取IP列表并檢驗IP的有效性
def get_ip_list():
f=open('IP.txt','r')
ip_list=f.readlines()
f.close()
return ip_list

#從IP列表中獲取隨機IP
def get_random_ip(ip_list):
proxy_ip = random.choice(ip_list)
proxy_ip=proxy_ip.strip('\n')
proxies = {'https': proxy_ip}
return proxies

def get_picture(url,ip_list):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#獲取隨機ip
proxies = get_random_ip(ip_list)
req = requests.get(url=url,headers=headers,proxies=proxies)
soup = BeautifulSoup(req.text,'lxml')

targets_url_1 = soup.find('figure')
targets_url = soup.find_all('noscript')

#保存圖片鏈接
list_url = []
for each in targets_url:
list_url.append(each.img.get('src'))

for each_img in list_url:
#判斷文件夾(圖庫)是否存在,若不存在則創(chuàng )建文件夾
if '圖庫' not in os.listdir():
os.makedirs('圖庫')
#下載圖片
proxies = get_random_ip(ip_list)
picture = '%s.jpg' % time.time()
req = requests.get(url=each_img,headers=headers,proxies=proxies)
with open('圖庫/{}.jpg'.format(picture),'wb') as f:
f.write(req.content)
#每爬取一張圖片暫停一秒防止ip被封
time.sleep(1)
print('{}下載完成!'.format(picture))

def main():
ip_list = get_ip_list()
url = 'https://www.zhihu.com/question/22918070'
get_picture(url,ip_list)

if __name__ == '__main__':
main()
復制代碼
  成功后截圖:
  
  爬行動(dòng)物簡(jiǎn)介:
  網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛,是一種用于自動(dòng)瀏覽萬(wàn)維網(wǎng)的網(wǎng)絡(luò )機器人。Web 爬蟲(chóng)從稱(chēng)為種子的統一資源地址 (URL) 列表開(kāi)始。當網(wǎng)絡(luò )爬蟲(chóng)訪(fǎng)問(wèn)這些統一的資源定位器時(shí),它們會(huì )識別頁(yè)面上的所有超鏈接,并將它們寫(xiě)入一個(gè)“訪(fǎng)問(wèn)列表”,即所謂的爬取域。此域上的 URL 將根據一組策略以循環(huán)方式訪(fǎng)問(wèn)。如果爬蟲(chóng)在執行過(guò)程中復制存檔上的信息并保存網(wǎng)站,這些存檔通常會(huì )被存儲起來(lái),以便于查看。閱讀和瀏覽他們存儲在 網(wǎng)站 上的信息并立即更新。這些存儲的網(wǎng)頁(yè)也稱(chēng)為“快照”。較大的網(wǎng)頁(yè)意味著(zhù)網(wǎng)絡(luò )爬蟲(chóng)在給定時(shí)間內只能下載網(wǎng)頁(yè)的較小部分,因此優(yōu)先下載。高變化率意味著(zhù)頁(yè)面可能已被更新或替換。一些服務(wù)器端軟件生成的 URL(統一資源定位器)也使網(wǎng)絡(luò )爬蟲(chóng)難以避免檢索重復的內容。(來(lái)自:維基百科)
  通過(guò)代碼訪(fǎng)問(wèn)網(wǎng)頁(yè)并將頁(yè)面內容保存在本地。url是爬蟲(chóng)識別網(wǎng)頁(yè)的重要標識。通過(guò)requests.get(url)獲取網(wǎng)頁(yè)的HTML代碼,通過(guò)BeautifulSoup解析HTML文件得到我們需要的內容。find()/find_all() 是 beautifulSoup 的兩個(gè)重要方法。
  補充知識點(diǎn):
  關(guān)于爬蟲(chóng)中的headers:在使用python爬蟲(chóng)爬取數據時(shí),我們經(jīng)常會(huì )遇到一些網(wǎng)站的反爬蟲(chóng)措施,一般都是針對headers中的User-Agent。如果不設置headers,User-Agent會(huì )聲明它是python腳本,如果網(wǎng)站有反爬蟲(chóng)的想法,必然會(huì )拒絕這樣的連接。通過(guò)修改headers,可以將自己的爬蟲(chóng)腳本偽裝成瀏覽器的正常訪(fǎng)問(wèn)來(lái)避免這個(gè)問(wèn)題。
  關(guān)于爬蟲(chóng)中的IP/代理: 設置好用戶(hù)代理后,應該考慮另一個(gè)問(wèn)題。程序的運行速度非???。如果我們使用爬蟲(chóng)程序來(lái)爬取網(wǎng)站中的東西,一個(gè)固定IP的訪(fǎng)問(wèn)頻率會(huì )很高,不符合人工操作的標準,因為人工操作不可能在內部進(jìn)行如此頻繁的訪(fǎng)問(wèn)幾毫秒。所以有些網(wǎng)站會(huì )設置IP訪(fǎng)問(wèn)頻率的閾值。如果某個(gè)IP的訪(fǎng)問(wèn)頻率超過(guò)了這個(gè)閾值,則說(shuō)明這不是人在訪(fǎng)問(wèn),而是爬蟲(chóng)。因此,當我們需要爬取大量數據時(shí),一個(gè)不斷變化的IP機制是必不可少的。我的代碼中的 IP.txt 文件就是為此機制準備的。
  關(guān)于 BeautifulSoup: 簡(jiǎn)單來(lái)說(shuō),Beautiful Soup 是一個(gè) Python 庫,其主要功能是從網(wǎng)頁(yè)中抓取數據。
  BeautifulSoup 的安裝:
  pip install beautifulsoup4
復制代碼

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,怎么辦)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 71 次瀏覽 ? 2022-02-04 01:02 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,怎么辦)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,chrome/firefox/ie瀏覽器好多都是網(wǎng)頁(yè)爬蟲(chóng)自帶的api,但是uc在國內不能使用api,所以要要用第三方的爬蟲(chóng),第三方爬蟲(chóng)可以選擇友盟,talkingdata,360/uc等第三方,也可以去搜狗開(kāi)放平臺注冊使用各種第三方的爬蟲(chóng)。第三方第三方爬蟲(chóng)相對用戶(hù)的量多,獲取數據也方便。
  1.chrome、火狐或其他現有網(wǎng)頁(yè)爬蟲(chóng)2.微博爬蟲(chóng)3.第三方微博爬蟲(chóng),
  百度,騰訊和好多門(mén)戶(hù)網(wǎng)站都是自己搞一套的,
  你怎么找這些網(wǎng)站不就一目了然了,知乎還有一個(gè)私家課,可以爬教程,這種不靠譜的都是虛假廣告。
  個(gè)人比較推薦talkingdata的數據,開(kāi)放性比較好,數據質(zhì)量也不錯,并且分析邏輯比較清晰。相比于其他的要容易上手一些。但現在爬蟲(chóng)出來(lái)的報告,只適合做一個(gè)簡(jiǎn)單的數據分析用,不適合做長(cháng)遠的業(yè)務(wù)規劃。還有建議爬蟲(chóng)的時(shí)候模仿別人做好的網(wǎng)站網(wǎng)站。實(shí)在要爬的話(huà),
  火狐瀏覽器直接設置用戶(hù)過(guò)濾:
  因為瀏覽器能力有限,網(wǎng)頁(yè)爬蟲(chóng)都是如此,很多網(wǎng)站在你登錄的時(shí)候就會(huì )屏蔽爬蟲(chóng)抓取這種網(wǎng)站,只能從第三方的網(wǎng)站進(jìn)行爬取或者是聯(lián)網(wǎng)調用一些第三方的爬蟲(chóng)。當然也有不少沒(méi)有限制的,在利用插件方面用的人比較多,你可以學(xué)一學(xué)搜狗爬蟲(chóng)插件和百度爬蟲(chóng)插件,學(xué)會(huì )之后相信你自己就可以找到一些公司聯(lián)系方式。還有一個(gè)好用的東西,uc瀏覽器也是可以進(jìn)行網(wǎng)頁(yè)爬蟲(chóng),可以從網(wǎng)站爬取信息,只要能進(jìn)入的網(wǎng)站都有接口,但是功能比較簡(jiǎn)單,比如點(diǎn)開(kāi)百度,然后點(diǎn)左下角相機,打開(kāi)一個(gè)頁(yè)面圖片什么的。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,怎么辦)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片都是走網(wǎng)頁(yè)自帶的httpserver,chrome/firefox/ie瀏覽器好多都是網(wǎng)頁(yè)爬蟲(chóng)自帶的api,但是uc在國內不能使用api,所以要要用第三方的爬蟲(chóng),第三方爬蟲(chóng)可以選擇友盟,talkingdata,360/uc等第三方,也可以去搜狗開(kāi)放平臺注冊使用各種第三方的爬蟲(chóng)。第三方第三方爬蟲(chóng)相對用戶(hù)的量多,獲取數據也方便。
  1.chrome、火狐或其他現有網(wǎng)頁(yè)爬蟲(chóng)2.微博爬蟲(chóng)3.第三方微博爬蟲(chóng),
  百度,騰訊和好多門(mén)戶(hù)網(wǎng)站都是自己搞一套的,
  你怎么找這些網(wǎng)站不就一目了然了,知乎還有一個(gè)私家課,可以爬教程,這種不靠譜的都是虛假廣告。
  個(gè)人比較推薦talkingdata的數據,開(kāi)放性比較好,數據質(zhì)量也不錯,并且分析邏輯比較清晰。相比于其他的要容易上手一些。但現在爬蟲(chóng)出來(lái)的報告,只適合做一個(gè)簡(jiǎn)單的數據分析用,不適合做長(cháng)遠的業(yè)務(wù)規劃。還有建議爬蟲(chóng)的時(shí)候模仿別人做好的網(wǎng)站網(wǎng)站。實(shí)在要爬的話(huà),
  火狐瀏覽器直接設置用戶(hù)過(guò)濾:
  因為瀏覽器能力有限,網(wǎng)頁(yè)爬蟲(chóng)都是如此,很多網(wǎng)站在你登錄的時(shí)候就會(huì )屏蔽爬蟲(chóng)抓取這種網(wǎng)站,只能從第三方的網(wǎng)站進(jìn)行爬取或者是聯(lián)網(wǎng)調用一些第三方的爬蟲(chóng)。當然也有不少沒(méi)有限制的,在利用插件方面用的人比較多,你可以學(xué)一學(xué)搜狗爬蟲(chóng)插件和百度爬蟲(chóng)插件,學(xué)會(huì )之后相信你自己就可以找到一些公司聯(lián)系方式。還有一個(gè)好用的東西,uc瀏覽器也是可以進(jìn)行網(wǎng)頁(yè)爬蟲(chóng),可以從網(wǎng)站爬取信息,只要能進(jìn)入的網(wǎng)站都有接口,但是功能比較簡(jiǎn)單,比如點(diǎn)開(kāi)百度,然后點(diǎn)左下角相機,打開(kāi)一個(gè)頁(yè)面圖片什么的。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(就是爬取小編精選的圖片小編精選-照片(組圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-02-03 14:16 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(就是爬取小編精選的圖片小編精選-照片(組圖))
  更好的體驗:Python 爬蟲(chóng)在行動(dòng)中 - Pixabay上的免費圖片
  
  Pixie,一個(gè)不錯的高清未經(jīng)審查的圖像網(wǎng)站,可以免費下載。
  /
  一些介紹
  超過(guò) 900,000 張高質(zhì)量的照片、插圖和矢量圖形。免費用于商業(yè)用途。無(wú)需歸屬。
  Pixabay是一個(gè)高質(zhì)量的圖片分享網(wǎng)站。網(wǎng)站 最初是由 Hans Braxmeier 和 Simon Steinberger 在德國開(kāi)發(fā)的。截至 2013 年 2 月,網(wǎng)站 有大約 70,000 張免費照片和矢量圖形,由社區中的電影制作人和插畫(huà)家提供。公司于2010年12月在德國烏爾姆成立。
  2012 年 3 月,Pixabay 開(kāi)始從私人圖片集網(wǎng)站 轉變?yōu)橹С?20 種語(yǔ)言的交互式在線(xiàn)社區 網(wǎng)站。同年5月,網(wǎng)站推出了公共應用編程接口,允許第三方用戶(hù)和網(wǎng)站開(kāi)發(fā)者搜索其圖片庫。網(wǎng)站還與 Flickr、YouTube 和 Wiki 共享資源。
  Pixabay用戶(hù)無(wú)需注冊即可獲得無(wú)版權的高質(zhì)量圖像。根據知識共享合約CC0相關(guān)的肖像權,用戶(hù)通過(guò)在本網(wǎng)站上傳圖片,默認放棄圖片版權,讓圖片得以廣泛傳播。網(wǎng)站允許任何人在未經(jīng)許可和背書(shū)的情況下使用、修改圖像——即使在商業(yè)應用中也是如此。
  為確保Pixabay上的高質(zhì)量圖片標準,用戶(hù)上傳的所有圖片都將由網(wǎng)站工作人員手動(dòng)審批。大約 27% 的用戶(hù)會(huì )說(shuō)英語(yǔ),20% 會(huì )說(shuō)西班牙語(yǔ),11% 會(huì )說(shuō)葡萄牙語(yǔ),7% 會(huì )說(shuō)德語(yǔ),5% 會(huì )說(shuō)法語(yǔ)。它的用戶(hù)主要是博主、平面設計師、作家、記者和廣告商。
  今天的目標是爬取小編的精選圖片小編的精選-圖片
  一、分析
  我們需要編寫(xiě)3個(gè)函數
  A Download(url) 下載圖片
  一個(gè)用于獲取編輯器選擇的FullUrl()總共165頁(yè)
  最后用來(lái)調用main()
  開(kāi)始一一寫(xiě)吧~
  編輯精選 - 照片
  打開(kāi)網(wǎng)頁(yè),F12,查看圖片鏈接所在的標簽
  
  
  你可以看到圖片鏈接都在那里
  標簽下,但是發(fā)現第一張和最后一張圖片的屬性不一樣,提取出來(lái)的
  “src”很好,使用xpath
  import requests
from lxml import etree
header = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36&#39;}
url = &#39;https://pixabay.com/zh/editors_choice/&#39;
r = requests.get(url,headers=header).text
s = etree.HTML(r)
print(s.xpath(&#39;//img/@src&#39;))
  結果發(fā)現
  
  前面是正確的圖片鏈接,后面卻出現'/static/img/blank.gif',這是什么鬼,查看網(wǎng)頁(yè)源代碼,搜索
  
  可以發(fā)現確實(shí)有這個(gè)字符串,我自己也花了很多時(shí)間在這上面。感謝幫助,Python爬蟲(chóng)動(dòng)態(tài)頁(yè)面爬取問(wèn)題?- 爬蟲(chóng)(計算機網(wǎng)絡(luò )) - 知乎
  瀏覽器中的代碼是用javascript修改的,可以直接用requests打印出來(lái)看看
  

/static/img/blank.gif



  在requests返回的數據中可以看到,“data-lazy”總是收錄我們需要的數據,修改代碼
  
  發(fā)現現在返回的數據就是我們需要的,打開(kāi)圖片查看
  
  
  下圖更清晰,我們只需要將“__340”替換為“_960_720”即可 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(就是爬取小編精選的圖片小編精選-照片(組圖))
  更好的體驗:Python 爬蟲(chóng)在行動(dòng)中 - Pixabay上的免費圖片
  
  Pixie,一個(gè)不錯的高清未經(jīng)審查的圖像網(wǎng)站,可以免費下載。
  /
  一些介紹
  超過(guò) 900,000 張高質(zhì)量的照片、插圖和矢量圖形。免費用于商業(yè)用途。無(wú)需歸屬。
  Pixabay是一個(gè)高質(zhì)量的圖片分享網(wǎng)站。網(wǎng)站 最初是由 Hans Braxmeier 和 Simon Steinberger 在德國開(kāi)發(fā)的。截至 2013 年 2 月,網(wǎng)站 有大約 70,000 張免費照片和矢量圖形,由社區中的電影制作人和插畫(huà)家提供。公司于2010年12月在德國烏爾姆成立。
  2012 年 3 月,Pixabay 開(kāi)始從私人圖片集網(wǎng)站 轉變?yōu)橹С?20 種語(yǔ)言的交互式在線(xiàn)社區 網(wǎng)站。同年5月,網(wǎng)站推出了公共應用編程接口,允許第三方用戶(hù)和網(wǎng)站開(kāi)發(fā)者搜索其圖片庫。網(wǎng)站還與 Flickr、YouTube 和 Wiki 共享資源。
  Pixabay用戶(hù)無(wú)需注冊即可獲得無(wú)版權的高質(zhì)量圖像。根據知識共享合約CC0相關(guān)的肖像權,用戶(hù)通過(guò)在本網(wǎng)站上傳圖片,默認放棄圖片版權,讓圖片得以廣泛傳播。網(wǎng)站允許任何人在未經(jīng)許可和背書(shū)的情況下使用、修改圖像——即使在商業(yè)應用中也是如此。
  為確保Pixabay上的高質(zhì)量圖片標準,用戶(hù)上傳的所有圖片都將由網(wǎng)站工作人員手動(dòng)審批。大約 27% 的用戶(hù)會(huì )說(shuō)英語(yǔ),20% 會(huì )說(shuō)西班牙語(yǔ),11% 會(huì )說(shuō)葡萄牙語(yǔ),7% 會(huì )說(shuō)德語(yǔ),5% 會(huì )說(shuō)法語(yǔ)。它的用戶(hù)主要是博主、平面設計師、作家、記者和廣告商。
  今天的目標是爬取小編的精選圖片小編的精選-圖片
  一、分析
  我們需要編寫(xiě)3個(gè)函數
  A Download(url) 下載圖片
  一個(gè)用于獲取編輯器選擇的FullUrl()總共165頁(yè)
  最后用來(lái)調用main()
  開(kāi)始一一寫(xiě)吧~
  編輯精選 - 照片
  打開(kāi)網(wǎng)頁(yè),F12,查看圖片鏈接所在的標簽
  
  
  你可以看到圖片鏈接都在那里
  標簽下,但是發(fā)現第一張和最后一張圖片的屬性不一樣,提取出來(lái)的
  “src”很好,使用xpath
  import requests
from lxml import etree
header = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36&#39;}
url = &#39;https://pixabay.com/zh/editors_choice/&#39;
r = requests.get(url,headers=header).text
s = etree.HTML(r)
print(s.xpath(&#39;//img/@src&#39;))
  結果發(fā)現
  
  前面是正確的圖片鏈接,后面卻出現'/static/img/blank.gif',這是什么鬼,查看網(wǎng)頁(yè)源代碼,搜索
  
  可以發(fā)現確實(shí)有這個(gè)字符串,我自己也花了很多時(shí)間在這上面。感謝幫助,Python爬蟲(chóng)動(dòng)態(tài)頁(yè)面爬取問(wèn)題?- 爬蟲(chóng)(計算機網(wǎng)絡(luò )) - 知乎
  瀏覽器中的代碼是用javascript修改的,可以直接用requests打印出來(lái)看看
  

/static/img/blank.gif



  在requests返回的數據中可以看到,“data-lazy”總是收錄我們需要的數據,修改代碼
  
  發(fā)現現在返回的數據就是我們需要的,打開(kāi)圖片查看
  
  
  下圖更清晰,我們只需要將“__340”替換為“_960_720”即可

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 72 次瀏覽 ? 2022-02-02 00:16 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞)
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&amp;cl=2&amp;lm=-1&amp;ie=utf-8&amp;oe=utf-8&amp;adpicid=&amp;st=-1&amp;z=&amp;ic=0&amp;word= % E4%BA%8C%E6%AC%A1%E5%85%83&amp;s=&amp;se=&amp;tab=&amp;width=&amp;height=&amp;face=0&amp;istype=2&amp;qc=&amp;nc=1&amp;fr=&amp;pn=60&amp;rn=30&amp;gsm=1000000001e&amp;81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(像是這樣%AB%98%(圖)(組圖))
  我最近在玩機器學(xué)習,想創(chuàng )建一個(gè)識別動(dòng)畫(huà)圖片的訓練集。我因沒(méi)有太多動(dòng)畫(huà)圖片而苦惱。后來(lái)突然想到可以用百度圖片,于是寫(xiě)了一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)抓取百度圖片(圖片關(guān)于一個(gè)關(guān)鍵詞
  第一步是找到搜索圖片的url。
  打開(kāi)百度圖片網(wǎng)頁(yè),搜索“高清動(dòng)畫(huà)”,檢查元素,檢查網(wǎng)絡(luò ),清除網(wǎng)絡(luò )請求數據,將頁(yè)面滾動(dòng)到底部,看到自動(dòng)加載更多,然后找到加載更多數據的url在網(wǎng)絡(luò )請求中。像這樣 %E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&amp;cl=2&amp;lm=-1&amp;ie=utf-8&amp;oe=utf-8&amp;adpicid=&amp;st=-1&amp;z=&amp;ic=0&amp;word= % E4%BA%8C%E6%AC%A1%E5%85%83&amp;s=&amp;se=&amp;tab=&amp;width=&amp;height=&amp;face=0&amp;istype=2&amp;qc=&amp;nc=1&amp;fr=&amp;pn=60&amp;rn=30&amp;gsm=1000000001e&amp;81=
  對比幾個(gè)加載較多的URL,發(fā)現rn參數是每頁(yè)顯示的次數,pn參數是請求的次數。通過(guò)修改rn參數和pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能有60個(gè),即rn設置最大為60.
  第二步是分析返回的數據。
  通過(guò)瀏覽器請求上面的url,在頁(yè)面上看到一個(gè)超級json。分析后發(fā)現圖片的url是thumbURL、middleURL、hoverurl這三個(gè)屬性,在返回的字符串中搜索這三個(gè)屬性的編號,發(fā)現該編號與分頁(yè)數一模一樣. 通過(guò)瀏覽器打開(kāi)這三個(gè)url,發(fā)現thumburl比middleUrl大,和hoverUrl是同一個(gè)url。其實(shí)還有一個(gè)objUrl(原圖)可以用,但是url不穩定,有時(shí)候404,有時(shí)候訪(fǎng)問(wèn)被拒絕。
  然后代碼
  我的 python 版本是 2.7
  更新于 2017 年 2 月 11 日
  1.保存的圖片改成原來(lái)的高清大圖OjbUrl
  2.修改使用方法,可以在命令行輸入搜索關(guān)鍵字
  3.隨時(shí)保存,保存前不再需要搜索所有圖片。
  百度圖片搜索.py
  #coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已經(jīng)存儲 " + str(self.__totleCount) + "張"
print "正在存儲 " + str(len(image_url_list)) + "張,存儲路徑:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 設置一個(gè)urlopen的超時(shí),如果10秒訪(fǎng)問(wèn)不到,就跳到下一個(gè)地址,防止程序卡在一個(gè)地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存儲 " + str(self.__totleCount) + " 張圖片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/ ... ot%3B + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
  使用示例
  運行.py
  #coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "親,你忘記帶搜索內容了哦~ 搜索內容關(guān)鍵字可多個(gè),使用空格分開(kāi)"
print "例如:python run.py 男生 頭像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
  ps:記得把_init_.py文件添加到兩個(gè)文件的同一目錄下?。?!
  run 方法,python run.py 關(guān)鍵字 1 關(guān)鍵字 2 關(guān)鍵字 3…
  一般搜索超過(guò)1900條就沒(méi)有了。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何用Python學(xué)習資料的小伙伴獲取圖片的url? )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-02-01 17:12 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何用Python學(xué)習資料的小伙伴獲取圖片的url?
)
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  1.獲取圖片的url鏈接
  首先,打開(kāi)百度圖片首頁(yè),注意下面url中的索引
  
  接下來(lái),將頁(yè)面切換到傳統的翻頁(yè)版本,因為這樣可以幫助我們抓取圖片!
  
  對比幾個(gè)url,發(fā)現pn參數是請求數。通過(guò)修改pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能收錄60張圖片。
  注意:gsm參數是pn參數的16進(jìn)制表示,去掉就可以了
  
  然后,右鍵查看網(wǎng)頁(yè)源代碼,直接(ctrl+F)搜索objURL
  
  這樣,我們就找到了需要圖片的url了。
  2.將圖片鏈接保存到本地
  現在,我們要做的就是抓取這些信息。
  注意:有objURL、hoverURL...但我們使用objURL是因為這是原圖
  那么,我如何獲取 objURL?使用正則表達式!
  那我們如何用正則表達式來(lái)實(shí)現呢?其實(shí)只需要一行代碼……
  results = re.findall('"objURL":"(.*?)",', html)
  核心代碼:
  1.獲取圖片url代碼:
  # 獲取圖片url連接def get_parse_page(pn,name): for i in range(int(pn)): # 1.獲取網(wǎng)頁(yè) print('正在獲取第{}頁(yè)'.format(i+1)) # 百度圖片首頁(yè)的url # name是你要搜索的關(guān)鍵詞 # pn是你想下載的頁(yè)數 url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%s&pn=%d' %(name,i*20) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400'} # 發(fā)送請求,獲取相應 response = requests.get(url, headers=headers) html = response.content.decode() # print(html) # 2.正則表達式解析網(wǎng)頁(yè) # "objURL":"http://n.sinaimg.cn/sports/tra ... ot%3B results = re.findall('"objURL":"(.*?)",', html) # 返回一個(gè)列表 # 根據獲取到的圖片鏈接,把圖片保存到本地 save_to_txt(results, name, i)
  2.保存圖片到本地代碼:
  # 保存圖片到本地def save_to_txt(results, name, i): j = 0 # 在當目錄下創(chuàng )建文件夾 if not os.path.exists('./' + name): os.makedirs('./' + name) # 下載圖片 for result in results: print('正在保存第{}個(gè)'.format(j)) try: pic = requests.get(result, timeout=10) time.sleep(1) except: print('當前圖片無(wú)法下載') j += 1 continue # 可忽略,這段代碼有bug # file_name = result.split('/') # file_name = file_name[len(file_name) - 1] # print(file_name) # # end = re.search('(.png|.jpg|.jpeg|.gif)$', file_name) # if end == None: # file_name = file_name + '.jpg' # 把圖片保存到文件夾 file_full_name = './' + name + '/' + str(i) + '-' + str(j) + '.jpg' with open(file_full_name, 'wb') as f: f.write(pic.content) j += 1
  3.主要功能代碼:
  # 主函數if __name__ == '__main__': name = input('請輸入你要下載的關(guān)鍵詞:') pn = input('你想下載前幾頁(yè)(1頁(yè)有60張):') get_parse_page(pn, name)
  使用說(shuō)明:
  # 配置以下模塊import requests import reimport osimport time# 1.運行 py源文件# 2.輸入你想搜索的關(guān)鍵詞,比如“柯基”、“泰迪”等# 3.輸入你想下載的頁(yè)數,比如5,那就是下載 5 x 60=300 張圖片 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(如何用Python學(xué)習資料的小伙伴獲取圖片的url?
)
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  1.獲取圖片的url鏈接
  首先,打開(kāi)百度圖片首頁(yè),注意下面url中的索引
  
  接下來(lái),將頁(yè)面切換到傳統的翻頁(yè)版本,因為這樣可以幫助我們抓取圖片!
  
  對比幾個(gè)url,發(fā)現pn參數是請求數。通過(guò)修改pn參數,觀(guān)察返回的數據,發(fā)現每頁(yè)最多只能收錄60張圖片。
  注意:gsm參數是pn參數的16進(jìn)制表示,去掉就可以了
  
  然后,右鍵查看網(wǎng)頁(yè)源代碼,直接(ctrl+F)搜索objURL
  
  這樣,我們就找到了需要圖片的url了。
  2.將圖片鏈接保存到本地
  現在,我們要做的就是抓取這些信息。
  注意:有objURL、hoverURL...但我們使用objURL是因為這是原圖
  那么,我如何獲取 objURL?使用正則表達式!
  那我們如何用正則表達式來(lái)實(shí)現呢?其實(shí)只需要一行代碼……
  results = re.findall('"objURL":"(.*?)",', html)
  核心代碼:
  1.獲取圖片url代碼:
  # 獲取圖片url連接def get_parse_page(pn,name): for i in range(int(pn)): # 1.獲取網(wǎng)頁(yè) print('正在獲取第{}頁(yè)'.format(i+1)) # 百度圖片首頁(yè)的url # name是你要搜索的關(guān)鍵詞 # pn是你想下載的頁(yè)數 url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%s&pn=%d' %(name,i*20) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400'} # 發(fā)送請求,獲取相應 response = requests.get(url, headers=headers) html = response.content.decode() # print(html) # 2.正則表達式解析網(wǎng)頁(yè) # "objURL":"http://n.sinaimg.cn/sports/tra ... ot%3B results = re.findall('"objURL":"(.*?)",', html) # 返回一個(gè)列表 # 根據獲取到的圖片鏈接,把圖片保存到本地 save_to_txt(results, name, i)
  2.保存圖片到本地代碼:
  # 保存圖片到本地def save_to_txt(results, name, i): j = 0 # 在當目錄下創(chuàng )建文件夾 if not os.path.exists('./' + name): os.makedirs('./' + name) # 下載圖片 for result in results: print('正在保存第{}個(gè)'.format(j)) try: pic = requests.get(result, timeout=10) time.sleep(1) except: print('當前圖片無(wú)法下載') j += 1 continue # 可忽略,這段代碼有bug # file_name = result.split('/') # file_name = file_name[len(file_name) - 1] # print(file_name) # # end = re.search('(.png|.jpg|.jpeg|.gif)$', file_name) # if end == None: # file_name = file_name + '.jpg' # 把圖片保存到文件夾 file_full_name = './' + name + '/' + str(i) + '-' + str(j) + '.jpg' with open(file_full_name, 'wb') as f: f.write(pic.content) j += 1
  3.主要功能代碼:
  # 主函數if __name__ == '__main__': name = input('請輸入你要下載的關(guān)鍵詞:') pn = input('你想下載前幾頁(yè)(1頁(yè)有60張):') get_parse_page(pn, name)
  使用說(shuō)明:
  # 配置以下模塊import requests import reimport osimport time# 1.運行 py源文件# 2.輸入你想搜索的關(guān)鍵詞,比如“柯基”、“泰迪”等# 3.輸入你想下載的頁(yè)數,比如5,那就是下載 5 x 60=300 張圖片

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(模擬瀏覽器打開(kāi)網(wǎng)頁(yè)的時(shí)候一般操作:打開(kāi)同類(lèi)壁紙)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 59 次瀏覽 ? 2022-01-30 18:00 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(模擬瀏覽器打開(kāi)網(wǎng)頁(yè)的時(shí)候一般操作:打開(kāi)同類(lèi)壁紙)
  前言
  在設計爬蟲(chóng)項目時(shí),首先要明確手動(dòng)瀏覽頁(yè)面獲取圖片時(shí)腦海中的步驟
  一般來(lái)說(shuō),我們上網(wǎng)批量打開(kāi)壁紙時(shí),一般操作如下:
  1、打開(kāi)壁紙頁(yè)面
  2、點(diǎn)擊壁紙圖片(打開(kāi)指定壁紙的頁(yè)面)
  3、選擇分辨率(我們要下載高分辨率圖片)
  4、保存圖片
  在實(shí)際操作中,我們實(shí)現了以下步驟訪(fǎng)問(wèn)網(wǎng)頁(yè)地址:打開(kāi)帶有壁紙的網(wǎng)頁(yè)→點(diǎn)擊壁紙圖片打開(kāi)指定頁(yè)面→選擇分辨率,點(diǎn)擊打開(kāi)最終保存目標圖片網(wǎng)頁(yè)→保存圖片
  在爬取過(guò)程中,我們嘗試通過(guò)模擬瀏覽器的操作打開(kāi)網(wǎng)頁(yè),一步一步獲取并訪(fǎng)問(wèn)該網(wǎng)頁(yè),最終獲取目標圖片的下載地址,下載圖片并保存到指定路徑
  *在這些中間過(guò)程中構建網(wǎng)頁(yè)的一些特定過(guò)濾條件,需要打開(kāi)指定頁(yè)面的源代碼,觀(guān)察并找到收錄有目的鏈接的標簽
  具體實(shí)施事項及注意事項
  這里只是想獲取一些指定的圖片,所以先在網(wǎng)頁(yè)上搜索“長(cháng)門(mén)由?!?,打開(kāi)一個(gè)搜索結果頁(yè)面,發(fā)現這個(gè)頁(yè)面已經(jīng)收錄了其他同類(lèi)型的壁紙鏈接,于是開(kāi)始設置本次搜索結果頁(yè)初次訪(fǎng)問(wèn)的目的地址
  目標結果頁(yè)面截圖:
  圖中下標為“1/29”?!?/29”是同類(lèi)型的其他目標壁紙。通過(guò)點(diǎn)擊這些圖片,我們可以打開(kāi)新的目標下載圖片頁(yè)面
  下面我們來(lái)看網(wǎng)頁(yè)的源代碼
  圖中黃底的地方就是打開(kāi)這些類(lèi)似壁紙的目的地址(訪(fǎng)問(wèn)時(shí)需要加前綴“”)
  現在我們可以嘗試構建爬蟲(chóng):
  打開(kāi)指定頁(yè)面→過(guò)濾獲取所有長(cháng)門(mén)由紀壁紙的目標下載頁(yè)面鏈接
  代碼顯示如下:
  獲取地址后,我們可以獲取地址→打開(kāi)指定頁(yè)面→選擇分辨率→獲取目標下載地址→保存到本地指定路徑
  測試時(shí),我輸出了上一步保存在truelist中的內容
  
  可以看到保存的只是一個(gè)后綴,我們需要在訪(fǎng)問(wèn)的時(shí)候加上一個(gè)指定的前綴
  實(shí)現代碼如下(注釋見(jiàn)代碼):
  終于可以在你的目標文件夾中看到爬下來(lái)的那組圖片了~
  轉載于: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(模擬瀏覽器打開(kāi)網(wǎng)頁(yè)的時(shí)候一般操作:打開(kāi)同類(lèi)壁紙)
  前言
  在設計爬蟲(chóng)項目時(shí),首先要明確手動(dòng)瀏覽頁(yè)面獲取圖片時(shí)腦海中的步驟
  一般來(lái)說(shuō),我們上網(wǎng)批量打開(kāi)壁紙時(shí),一般操作如下:
  1、打開(kāi)壁紙頁(yè)面
  2、點(diǎn)擊壁紙圖片(打開(kāi)指定壁紙的頁(yè)面)
  3、選擇分辨率(我們要下載高分辨率圖片)
  4、保存圖片
  在實(shí)際操作中,我們實(shí)現了以下步驟訪(fǎng)問(wèn)網(wǎng)頁(yè)地址:打開(kāi)帶有壁紙的網(wǎng)頁(yè)→點(diǎn)擊壁紙圖片打開(kāi)指定頁(yè)面→選擇分辨率,點(diǎn)擊打開(kāi)最終保存目標圖片網(wǎng)頁(yè)→保存圖片
  在爬取過(guò)程中,我們嘗試通過(guò)模擬瀏覽器的操作打開(kāi)網(wǎng)頁(yè),一步一步獲取并訪(fǎng)問(wèn)該網(wǎng)頁(yè),最終獲取目標圖片的下載地址,下載圖片并保存到指定路徑
  *在這些中間過(guò)程中構建網(wǎng)頁(yè)的一些特定過(guò)濾條件,需要打開(kāi)指定頁(yè)面的源代碼,觀(guān)察并找到收錄有目的鏈接的標簽
  具體實(shí)施事項及注意事項
  這里只是想獲取一些指定的圖片,所以先在網(wǎng)頁(yè)上搜索“長(cháng)門(mén)由?!?,打開(kāi)一個(gè)搜索結果頁(yè)面,發(fā)現這個(gè)頁(yè)面已經(jīng)收錄了其他同類(lèi)型的壁紙鏈接,于是開(kāi)始設置本次搜索結果頁(yè)初次訪(fǎng)問(wèn)的目的地址
  目標結果頁(yè)面截圖:
  圖中下標為“1/29”?!?/29”是同類(lèi)型的其他目標壁紙。通過(guò)點(diǎn)擊這些圖片,我們可以打開(kāi)新的目標下載圖片頁(yè)面
  下面我們來(lái)看網(wǎng)頁(yè)的源代碼
  圖中黃底的地方就是打開(kāi)這些類(lèi)似壁紙的目的地址(訪(fǎng)問(wèn)時(shí)需要加前綴“”)
  現在我們可以嘗試構建爬蟲(chóng):
  打開(kāi)指定頁(yè)面→過(guò)濾獲取所有長(cháng)門(mén)由紀壁紙的目標下載頁(yè)面鏈接
  代碼顯示如下:
  獲取地址后,我們可以獲取地址→打開(kāi)指定頁(yè)面→選擇分辨率→獲取目標下載地址→保存到本地指定路徑
  測試時(shí),我輸出了上一步保存在truelist中的內容
  
  可以看到保存的只是一個(gè)后綴,我們需要在訪(fǎng)問(wèn)的時(shí)候加上一個(gè)指定的前綴
  實(shí)現代碼如下(注釋見(jiàn)代碼):
  終于可以在你的目標文件夾中看到爬下來(lái)的那組圖片了~
  轉載于:

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(連游戲都沒(méi)法玩3臺電腦一般是想只用python程序運行嗎)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 61 次瀏覽 ? 2022-01-30 09:11 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(連游戲都沒(méi)法玩3臺電腦一般是想只用python程序運行嗎)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片、爬蟲(chóng)抓取糗百、爬蟲(chóng)抓取ebay等美劇網(wǎng)頁(yè)網(wǎng)頁(yè)爬蟲(chóng)抓取知乎等。
  python大法好
  我們公司一直用通用爬蟲(chóng)+python的解決方案,采購的電腦一臺cpu8核心15線(xiàn)程,主頻2.7ghz的,兩個(gè)服務(wù)器,加起來(lái)三千多。
  連游戲都沒(méi)法玩
  3臺電腦一般是軟路由啊
  同一個(gè)電腦同時(shí)開(kāi)機游戲就打不了了
  提主是想只用python程序運行嗎?我們公司專(zhuān)門(mén)有兩臺esxi交換機,一臺做服務(wù)器,一臺做內網(wǎng)ip,web系統用的nginx,負載均衡用docker(輪詢(xún),slb),全部用python來(lái)寫(xiě),沒(méi)問(wèn)題,前提是不同的系統不要影響同一個(gè)程序正常運行。要是想只用python來(lái)寫(xiě)程序,那我建議用pypy吧,可以在同一個(gè)程序上打到linux系統中。
  以上所有操作都可以通過(guò)gateway配置來(lái)實(shí)現,只需要改變loadlibrarylistener到pypy即可。
  iphone4
  一臺windows一臺mac
  redhat,gentoo,linux系統有自己的內核來(lái)支持虛擬化,windows虛擬化不是很好,中國特色吧。
  玩游戲還是玩python吧,這個(gè)沒(méi)的說(shuō)。
  同時(shí)開(kāi)200臺電腦都不卡!開(kāi)個(gè)網(wǎng)頁(yè)嗖嗖的,服務(wù)器性能肯定夠。如果是做網(wǎng)頁(yè)爬蟲(chóng),本地沒(méi)有能跑python的環(huán)境,建議用阿里云ecs,給新客戶(hù)送的那個(gè),有物理隔離。如果只是單純的用python爬數據,建議只用mysql,其他的也沒(méi)啥可以折騰的。另外解決網(wǎng)絡(luò )問(wèn)題,一臺主機上windows還有nginxlvssocks5mapredisapache等都安裝好才是最重要的,穩定運行用linux最好,或者干脆windowsserver也行。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(連游戲都沒(méi)法玩3臺電腦一般是想只用python程序運行嗎)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片、爬蟲(chóng)抓取糗百、爬蟲(chóng)抓取ebay等美劇網(wǎng)頁(yè)網(wǎng)頁(yè)爬蟲(chóng)抓取知乎等。
  python大法好
  我們公司一直用通用爬蟲(chóng)+python的解決方案,采購的電腦一臺cpu8核心15線(xiàn)程,主頻2.7ghz的,兩個(gè)服務(wù)器,加起來(lái)三千多。
  連游戲都沒(méi)法玩
  3臺電腦一般是軟路由啊
  同一個(gè)電腦同時(shí)開(kāi)機游戲就打不了了
  提主是想只用python程序運行嗎?我們公司專(zhuān)門(mén)有兩臺esxi交換機,一臺做服務(wù)器,一臺做內網(wǎng)ip,web系統用的nginx,負載均衡用docker(輪詢(xún),slb),全部用python來(lái)寫(xiě),沒(méi)問(wèn)題,前提是不同的系統不要影響同一個(gè)程序正常運行。要是想只用python來(lái)寫(xiě)程序,那我建議用pypy吧,可以在同一個(gè)程序上打到linux系統中。
  以上所有操作都可以通過(guò)gateway配置來(lái)實(shí)現,只需要改變loadlibrarylistener到pypy即可。
  iphone4
  一臺windows一臺mac
  redhat,gentoo,linux系統有自己的內核來(lái)支持虛擬化,windows虛擬化不是很好,中國特色吧。
  玩游戲還是玩python吧,這個(gè)沒(méi)的說(shuō)。
  同時(shí)開(kāi)200臺電腦都不卡!開(kāi)個(gè)網(wǎng)頁(yè)嗖嗖的,服務(wù)器性能肯定夠。如果是做網(wǎng)頁(yè)爬蟲(chóng),本地沒(méi)有能跑python的環(huán)境,建議用阿里云ecs,給新客戶(hù)送的那個(gè),有物理隔離。如果只是單純的用python爬數據,建議只用mysql,其他的也沒(méi)啥可以折騰的。另外解決網(wǎng)絡(luò )問(wèn)題,一臺主機上windows還有nginxlvssocks5mapredisapache等都安裝好才是最重要的,穩定運行用linux最好,或者干脆windowsserver也行。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(url向百度發(fā)送請求import#需要用這個(gè)包進(jìn)行正則匹配import)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-01-29 22:13 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(url向百度發(fā)送請求import#需要用這個(gè)包進(jìn)行正則匹配import)
  宣布
  此文章僅供學(xué)習使用,如果讀者利用此方法進(jìn)行違法犯罪活動(dòng),與本人無(wú)關(guān)。
  爬蟲(chóng)已經(jīng)觸犯了法律,因此需要謹慎使用。
  下面開(kāi)始文字
  一、導入幾個(gè)需要用到的包
  import requests #需要使用這個(gè)包向百度發(fā)送請求
  import re #需要使用這個(gè)包進(jìn)行正則匹配
  import time #Sleep 避免對服務(wù)器造成太大壓力
  這里的requests主要作用是向百度發(fā)送請求,也就是模仿人工操作進(jìn)行訪(fǎng)問(wèn)。有兩種方法:post 和 get。這里我們使用get方法。
  然后,開(kāi)始向百度發(fā)送請求。當然,你需要一個(gè)百度圖片的鏈接。首先,訪(fǎng)問(wèn)百度的圖片,看看鏈接是什么樣子的。
  url 列如下所示:
  皮卡丘
  去掉一些不必要的內容后,可以長(cháng)成這樣
  皮卡丘
  如果你不相信我,你可以試試。
  然后分析url,前者肯定是固定格式,不能更改,而后者word=Pikachu顯然就是我們搜索的關(guān)鍵詞。url就解決了,然后向百度發(fā)送請求。代碼顯示如下:
  html = requests.get(url)
  html.encoding = html.apparent_encoding #這里可以查看需要爬取的頁(yè)面的源碼,一般是utf-8,但不是全部。
  html = html.text #這里需要獲取對應的文本,用于后面的正則匹配操作
  接下來(lái)就是操作源碼了。最好對網(wǎng)絡(luò )前端有所了解。如果沒(méi)有,至少檢查一下源碼(最簡(jiǎn)單的操作是在網(wǎng)址欄前面加上view-source)
  一、在源頁(yè)面搜索jpg(百度圖片后綴,先找到圖片鏈接)
  只需抓取一個(gè)鏈接并分析它:
  {"ObjURL":"http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg","ObjUrl":"http:\/\/\/forum\/pic\ /項目\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg"
  抓取http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg里面,訪(fǎng)問(wèn)一下,發(fā)現是可以訪(fǎng)問(wèn)的。又試了幾次,發(fā)現只有objURL開(kāi)頭的可以訪(fǎng)問(wèn),而objURL開(kāi)頭的可能無(wú)法訪(fǎng)問(wèn)。沒(méi)關(guān)系,先把所有的
  "ObjURL":"xxxx"
  格式中的所有鏈接都找到了,這時(shí)候就需要使用正則匹配了。代碼顯示如下:
  urls = re.findall('"objURL":"(.*?)"',html,re.S) #這里使用導入的re包
  需要注意的是,re.findall匹配的數據是一個(gè)列表,需要用for循環(huán)逐個(gè)訪(fǎng)問(wèn):
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  一個(gè)最簡(jiǎn)單的爬蟲(chóng)已經(jīng)寫(xiě)好了,但是如果有一點(diǎn)錯誤就會(huì )報錯。沒(méi)有所謂的魯棒性。如何改進(jìn)爬蟲(chóng)將在下一篇文章文章中解釋。
  完整代碼如下,大家可以自己體驗一下:
  導入請求
  重新進(jìn)口
  進(jìn)口時(shí)間
  url = '皮卡丘'
  html = requests.get(url)
  html.encoding = html.apparent_encoding
  html = html.text
  urls = re.findall('"objURL":"(.*?)"',html,re.S)
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  注:最后給大家發(fā)一套2020年最新的企業(yè)級Python項目實(shí)戰視頻教程,點(diǎn)此領(lǐng)取,跟著(zhù)實(shí)踐。希望大家一起進(jìn)步! 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(url向百度發(fā)送請求import#需要用這個(gè)包進(jìn)行正則匹配import)
  宣布
  此文章僅供學(xué)習使用,如果讀者利用此方法進(jìn)行違法犯罪活動(dòng),與本人無(wú)關(guān)。
  爬蟲(chóng)已經(jīng)觸犯了法律,因此需要謹慎使用。
  下面開(kāi)始文字
  一、導入幾個(gè)需要用到的包
  import requests #需要使用這個(gè)包向百度發(fā)送請求
  import re #需要使用這個(gè)包進(jìn)行正則匹配
  import time #Sleep 避免對服務(wù)器造成太大壓力
  這里的requests主要作用是向百度發(fā)送請求,也就是模仿人工操作進(jìn)行訪(fǎng)問(wèn)。有兩種方法:post 和 get。這里我們使用get方法。
  然后,開(kāi)始向百度發(fā)送請求。當然,你需要一個(gè)百度圖片的鏈接。首先,訪(fǎng)問(wèn)百度的圖片,看看鏈接是什么樣子的。
  url 列如下所示:
  皮卡丘
  去掉一些不必要的內容后,可以長(cháng)成這樣
  皮卡丘
  如果你不相信我,你可以試試。
  然后分析url,前者肯定是固定格式,不能更改,而后者word=Pikachu顯然就是我們搜索的關(guān)鍵詞。url就解決了,然后向百度發(fā)送請求。代碼顯示如下:
  html = requests.get(url)
  html.encoding = html.apparent_encoding #這里可以查看需要爬取的頁(yè)面的源碼,一般是utf-8,但不是全部。
  html = html.text #這里需要獲取對應的文本,用于后面的正則匹配操作
  接下來(lái)就是操作源碼了。最好對網(wǎng)絡(luò )前端有所了解。如果沒(méi)有,至少檢查一下源碼(最簡(jiǎn)單的操作是在網(wǎng)址欄前面加上view-source)
  一、在源頁(yè)面搜索jpg(百度圖片后綴,先找到圖片鏈接)
  只需抓取一個(gè)鏈接并分析它:
  {"ObjURL":"http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg","ObjUrl":"http:\/\/\/forum\/pic\ /項目\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg"
  抓取http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg里面,訪(fǎng)問(wèn)一下,發(fā)現是可以訪(fǎng)問(wèn)的。又試了幾次,發(fā)現只有objURL開(kāi)頭的可以訪(fǎng)問(wèn),而objURL開(kāi)頭的可能無(wú)法訪(fǎng)問(wèn)。沒(méi)關(guān)系,先把所有的
  "ObjURL":"xxxx"
  格式中的所有鏈接都找到了,這時(shí)候就需要使用正則匹配了。代碼顯示如下:
  urls = re.findall('"objURL":"(.*?)"',html,re.S) #這里使用導入的re包
  需要注意的是,re.findall匹配的數據是一個(gè)列表,需要用for循環(huán)逐個(gè)訪(fǎng)問(wèn):
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  一個(gè)最簡(jiǎn)單的爬蟲(chóng)已經(jīng)寫(xiě)好了,但是如果有一點(diǎn)錯誤就會(huì )報錯。沒(méi)有所謂的魯棒性。如何改進(jìn)爬蟲(chóng)將在下一篇文章文章中解釋。
  完整代碼如下,大家可以自己體驗一下:
  導入請求
  重新進(jìn)口
  進(jìn)口時(shí)間
  url = '皮卡丘'
  html = requests.get(url)
  html.encoding = html.apparent_encoding
  html = html.text
  urls = re.findall('"objURL":"(.*?)"',html,re.S)
  我 = 0
  對于網(wǎng)址中的網(wǎng)址:
  time.sleep(3) #睡眠3秒
  imag = requests.get(url,timeout = 6).content
  #timeout表示每個(gè)請求最多6秒,否則會(huì )卡住
  如果想象:
  使用 open(str(i) + '.jpg','wb') 作為 f:
  print('正在下載第 %d 張圖片:%s' %(i + 1,url))
  f.write(imag)
  我 += 1
  別的:
  print('鏈接超時(shí),圖片下載失敗')
  print('圖片下載成功')
  注:最后給大家發(fā)一套2020年最新的企業(yè)級Python項目實(shí)戰視頻教程,點(diǎn)此領(lǐng)取,跟著(zhù)實(shí)踐。希望大家一起進(jìn)步!

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(要求:爬取30張百度圖片中關(guān)曉彤的照片??! )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-01-29 22:11 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(要求:爬取30張百度圖片中關(guān)曉彤的照片??!
)
  要求:在百度圖片中抓取關(guān)曉彤的30張照片! ! !首先,遵循一個(gè)爬蟲(chóng)的大致開(kāi)發(fā)流程:
  
  (1)分析網(wǎng)頁(yè):由于網(wǎng)頁(yè)的源代碼太復雜,想要找到我們想要的太難了,所以隨便找一張圖片的url,操作是如下:
  
  然后,查看網(wǎng)頁(yè)的源碼,ctrl+f搜索剛剛找到的圖片的url,會(huì )找到三個(gè),我們以第一個(gè)為例:
  
  #觀(guān)察前面有一個(gè)thumbURL,我們在這個(gè)源碼中搜索:
  
  如你所見(jiàn),我們只需要借用 thumbURL 來(lái)使用正則表達式來(lái)匹配每張圖片的 url。 (2)代碼編寫(xiě):
  #1.找目標數據
#2.分析請求流程 (1)每個(gè)關(guān)曉彤照片就是一個(gè)url (2)拿到這些url (3)會(huì )發(fā)現有30個(gè)thumbURL 這就剛好對應30個(gè)關(guān)曉彤照片的url(這些都在page_url里)
import urllib3
import re
import os
http = urllib3.PoolManager()
# 第一部分:獲取包含這些圖片的網(wǎng)頁(yè)的代碼
page_url = "https://image.baidu.com/search ... ot%3B
res = http.request("GET",page_url)
html = res.data.decode()
# print(html)
# 第二部分:利用正則鎖定我們所要爬取的圖片的url
img_urls = re.findall('thumbURL":"(.*?)"',html)
print(img_urls)
# 將圖片扔到文件夾里
if not os.path.exists("girl_imgs"):
os.mkdir("girl_imgs")
# 遍歷對每個(gè)圖片url發(fā)起請求
for index,img_url in enumerate(img_urls):
res=http.request("GET",img_url)
img_data=res.data
filename="girl_imgs/"+str(index)+".jpg"
with open(filename,"wb") as f:
f.write(img_data)
  注意:如果不能爬取,會(huì )被封禁。發(fā)送請求時(shí)添加標頭。如果只在header中添加user-agent,報錯,添加referer(熱鏈)!
  
   查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(要求:爬取30張百度圖片中關(guān)曉彤的照片??!
)
  要求:在百度圖片中抓取關(guān)曉彤的30張照片! ! !首先,遵循一個(gè)爬蟲(chóng)的大致開(kāi)發(fā)流程:
  
  (1)分析網(wǎng)頁(yè):由于網(wǎng)頁(yè)的源代碼太復雜,想要找到我們想要的太難了,所以隨便找一張圖片的url,操作是如下:
  
  然后,查看網(wǎng)頁(yè)的源碼,ctrl+f搜索剛剛找到的圖片的url,會(huì )找到三個(gè),我們以第一個(gè)為例:
  
  #觀(guān)察前面有一個(gè)thumbURL,我們在這個(gè)源碼中搜索:
  
  如你所見(jiàn),我們只需要借用 thumbURL 來(lái)使用正則表達式來(lái)匹配每張圖片的 url。 (2)代碼編寫(xiě):
  #1.找目標數據
#2.分析請求流程 (1)每個(gè)關(guān)曉彤照片就是一個(gè)url (2)拿到這些url (3)會(huì )發(fā)現有30個(gè)thumbURL 這就剛好對應30個(gè)關(guān)曉彤照片的url(這些都在page_url里)
import urllib3
import re
import os
http = urllib3.PoolManager()
# 第一部分:獲取包含這些圖片的網(wǎng)頁(yè)的代碼
page_url = "https://image.baidu.com/search ... ot%3B
res = http.request("GET",page_url)
html = res.data.decode()
# print(html)
# 第二部分:利用正則鎖定我們所要爬取的圖片的url
img_urls = re.findall('thumbURL":"(.*?)"',html)
print(img_urls)
# 將圖片扔到文件夾里
if not os.path.exists("girl_imgs"):
os.mkdir("girl_imgs")
# 遍歷對每個(gè)圖片url發(fā)起請求
for index,img_url in enumerate(img_urls):
res=http.request("GET",img_url)
img_data=res.data
filename="girl_imgs/"+str(index)+".jpg"
with open(filename,"wb") as f:
f.write(img_data)
  注意:如果不能爬取,會(huì )被封禁。發(fā)送請求時(shí)添加標頭。如果只在header中添加user-agent,報錯,添加referer(熱鏈)!
  
  

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重?t)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 54 次瀏覽 ? 2022-01-29 12:06 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重?t)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重。爬蟲(chóng)基礎架構是httpget請求。這里需要在指定的url下去重。要知道,requestheader字段在這個(gè)過(guò)程中會(huì )被逐個(gè)嘗試,acceptlanguageauthorizationcontext這幾項下面是一些常見(jiàn)的做法。http請求逐個(gè)嘗試有幾個(gè)比較方便的做法:tcp抽取數據v1.0:socket編程基礎googlehttprequest抽取文件http文件直接傳輸200,201,213之類(lèi)的。
  需要提前想好接收的url名稱(chēng)和文件名。http文件獲取googlehttprequest抽取bulk數據bulk方式的有兩種:url后綴或者/。這里教大家一個(gè)python基礎里的重載get方法基礎知識,考驗的不是使用get方法取數據,而是獲取attribute字段的字典:classme(http.get):def__init__(self,salary,b...):self.salary=salaryself.b=bself.preload=false...通過(guò)這個(gè)例子,希望你知道request請求的response屬性里面的salary和b,如何去理解。
  第一次和后續的爬蟲(chóng)代碼基礎爬蟲(chóng)代碼基礎,注意把make_auth,forwardedheader和user_agent這三個(gè)參數寫(xiě)好。我一般都用后綴名.string形式。ps:我自己用urllib.request庫爬微博博客爬取文章過(guò)程中發(fā)現,網(wǎng)頁(yè)很多都是重復的,很久前的。于是,我把request請求的頭部信息拆解,寫(xiě)成了函數。
  下面是一個(gè)python的程序,都在python庫中實(shí)現。#!/usr/bin/envpython#-*-coding:utf-8-*-fromcollectionsimportordereddictfromseleniumimportwebdriverfromdatetimeimportdatetimefromflaskimportflaskdefget_auth(url,headers):returnhttp.session().get(url).select(headers=headers)defget_header(url,headers):returnhttp.session().get(url).select(headers=headers)if__name__=='__main__':urls=[微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersdatetime=datetime.now()ifsys.argv[1]=='':print(sys.argv[1])returnhttp.session().get(url,headers=headers)if__name__=='__main__':client=collections.ordereddict()p_url=['''微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersif__name__=='__main__':urls=['微博博客爬取bulkdata'''。 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重?t)
  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片,需要先去重。爬蟲(chóng)基礎架構是httpget請求。這里需要在指定的url下去重。要知道,requestheader字段在這個(gè)過(guò)程中會(huì )被逐個(gè)嘗試,acceptlanguageauthorizationcontext這幾項下面是一些常見(jiàn)的做法。http請求逐個(gè)嘗試有幾個(gè)比較方便的做法:tcp抽取數據v1.0:socket編程基礎googlehttprequest抽取文件http文件直接傳輸200,201,213之類(lèi)的。
  需要提前想好接收的url名稱(chēng)和文件名。http文件獲取googlehttprequest抽取bulk數據bulk方式的有兩種:url后綴或者/。這里教大家一個(gè)python基礎里的重載get方法基礎知識,考驗的不是使用get方法取數據,而是獲取attribute字段的字典:classme(http.get):def__init__(self,salary,b...):self.salary=salaryself.b=bself.preload=false...通過(guò)這個(gè)例子,希望你知道request請求的response屬性里面的salary和b,如何去理解。
  第一次和后續的爬蟲(chóng)代碼基礎爬蟲(chóng)代碼基礎,注意把make_auth,forwardedheader和user_agent這三個(gè)參數寫(xiě)好。我一般都用后綴名.string形式。ps:我自己用urllib.request庫爬微博博客爬取文章過(guò)程中發(fā)現,網(wǎng)頁(yè)很多都是重復的,很久前的。于是,我把request請求的頭部信息拆解,寫(xiě)成了函數。
  下面是一個(gè)python的程序,都在python庫中實(shí)現。#!/usr/bin/envpython#-*-coding:utf-8-*-fromcollectionsimportordereddictfromseleniumimportwebdriverfromdatetimeimportdatetimefromflaskimportflaskdefget_auth(url,headers):returnhttp.session().get(url).select(headers=headers)defget_header(url,headers):returnhttp.session().get(url).select(headers=headers)if__name__=='__main__':urls=[微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersdatetime=datetime.now()ifsys.argv[1]=='':print(sys.argv[1])returnhttp.session().get(url,headers=headers)if__name__=='__main__':client=collections.ordereddict()p_url=['''微博博客爬取bulkdata'''try:headers=headersexcept:headers=headersif__name__=='__main__':urls=['微博博客爬取bulkdata'''。

網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(利用python抓取網(wǎng)絡(luò )圖片的步驟:1.根據給定的網(wǎng)址獲取)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 75 次瀏覽 ? 2022-01-28 18:07 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(利用python抓取網(wǎng)絡(luò )圖片的步驟:1.根據給定的網(wǎng)址獲取)
  使用python抓取網(wǎng)絡(luò )圖片的步驟:
  1.根據給定的URL獲取網(wǎng)頁(yè)的源代碼
  2.使用正則表達式過(guò)濾掉源碼中的圖片地址
  3.根據過(guò)濾后的圖片地址下載網(wǎng)絡(luò )圖片
  #coding=UTF-8
import urllib2
import urllib
import re
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getJpg(html):
reg = r&#39;"largeTnImageUrl":"(.+?\.jpg)",&#39;
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
print imgurl
#urllib.urlretrieve(imgurl, &#39;D:/test/%s.html&#39; % x)
header = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11&#39;,
&#39;Accept&#39;:&#39;text/html;q=0.9,*/*;q=0.8&#39;,
&#39;Accept-Charset&#39;:&#39;ISO-8859-1,utf-8;q=0.7,*;q=0.3&#39;,
&#39;Accept-Encoding&#39;:&#39;gzip&#39;,
&#39;Connection&#39;:&#39;close&#39;,
&#39;Referer&#39;:&#39;http://image.baidu.com/i%3Ftn% ... 39%3B
}
timeout = 30
request = urllib2.Request(imgurl,None,header)
response = urllib2.urlopen(request,None,timeout)
str = response.read()
foo = open("D:/test/%s.gif" % x,"wb")
foo.write(str)
foo.close()
x += 1

html = getHtml(&#39;http://image.baidu.com/i%3Ftn% ... %2339;)
print getJpg(html)
  博客示例參考:
  在參考博客實(shí)現示例的過(guò)程中,我也遇到了一些問(wèn)題。圖片已下載,但無(wú)法預覽。經(jīng)過(guò)多次分析,發(fā)現百度圖片設置了反爬。為了解決這個(gè)問(wèn)題,我參考了另一篇博文。
  模擬瀏覽器發(fā)送請求并欺騙服務(wù)器進(jìn)行反爬: 查看全部

  網(wǎng)頁(yè)爬蟲(chóng)抓取百度圖片(利用python抓取網(wǎng)絡(luò )圖片的步驟:1.根據給定的網(wǎng)址獲取)
  使用python抓取網(wǎng)絡(luò )圖片的步驟:
  1.根據給定的URL獲取網(wǎng)頁(yè)的源代碼
  2.使用正則表達式過(guò)濾掉源碼中的圖片地址
  3.根據過(guò)濾后的圖片地址下載網(wǎng)絡(luò )圖片
  #coding=UTF-8
import urllib2
import urllib
import re
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getJpg(html):
reg = r&#39;"largeTnImageUrl":"(.+?\.jpg)",&#39;
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
print imgurl
#urllib.urlretrieve(imgurl, &#39;D:/test/%s.html&#39; % x)
header = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11&#39;,
&#39;Accept&#39;:&#39;text/html;q=0.9,*/*;q=0.8&#39;,
&#39;Accept-Charset&#39;:&#39;ISO-8859-1,utf-8;q=0.7,*;q=0.3&#39;,
&#39;Accept-Encoding&#39;:&#39;gzip&#39;,
&#39;Connection&#39;:&#39;close&#39;,
&#39;Referer&#39;:&#39;http://image.baidu.com/i%3Ftn% ... 39%3B
}
timeout = 30
request = urllib2.Request(imgurl,None,header)
response = urllib2.urlopen(request,None,timeout)
str = response.read()
foo = open("D:/test/%s.gif" % x,"wb")
foo.write(str)
foo.close()
x += 1

html = getHtml(&#39;http://image.baidu.com/i%3Ftn% ... %2339;)
print getJpg(html)
  博客示例參考:
  在參考博客實(shí)現示例的過(guò)程中,我也遇到了一些問(wèn)題。圖片已下載,但無(wú)法預覽。經(jīng)過(guò)多次分析,發(fā)現百度圖片設置了反爬。為了解決這個(gè)問(wèn)題,我參考了另一篇博文。
  模擬瀏覽器發(fā)送請求并欺騙服務(wù)器進(jìn)行反爬:

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

最近中文字幕2019高清,亚洲人成高清在线播放,男生淦哭男生图片动漫有字,国产亚洲精品九九久在线观看,无码av专区丝袜专区