ターゲットアドレス:http://image.baidu.com/Enter
美しさ
分析URL
メタURLを図に示します
貼り付けは次のようになります
(ブラウザのURLバーに中国語がはっきりと表示されますが、URLをコピーしてメモ帳やコードに貼り付けるとこんな感じになります???)
https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1610771025434_R&pv=&ic=&nc=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E7%BE%8E%E5%A5%B3
一部のgetパラメータまたはキーワードは多くのWebサイトのURLにエンコードされているため、それらをコピーすると問題が発生します。
URLエンコードとデコード
import urllib
from urllib import parse
import urllib.request
data = {
'word': '美女'}
# Python3的urlencode需要从parse中调用,可以看到urlencode()接受的是一个字典
print(urllib.parse.urlencode(data))
# 通过urllib.request.unquote()方法,把URL编码字符串,转换回原先字符串
print(urllib.request.unquote('word=%E7%BE%8E%E5%A5%B3'))
ソースコード
F12を分析するか、ページを右クリックして要素を確認します。開いた後、画像の位置を見つけます
次のURLをコピーし、
エスケープ文字に注意してください
imgurl="https:\/\/ss0.bdstatic.com\/70cFvHSh_Q1YnxGkpoWK1HF6hhy\/it\/u=2718853745,1288801299&fm=214&gp=0.jpg"
次に、現在のウェブページの空白の領域を右クリックします:ウェブページのソースコードを表示し
、ショートカットキーCTRl + Fを使用して
検索します(ここにgp = 0.jpgと入力して、最後のいくつかを入力して画像を見つけます画像のURLの文字)
なぜこの写真には非常に多くのアドレスがあり、どれを使用するのですか?あなたはthumbURL、objURLなどを見ることができます。
分析により、最初の2つは縮小バージョンであり、ホバーはマウスを動かした後に表示されるバージョンであり、objURLに対応するアドレスが必要なものであることがわかります。信じられない場合は、これらのURLを開くことができます。そして、objが最大で最も明確であることを見つけます。
正規表現またはXPath式を記述します
pic_url = re.findall(’“objURL”:"(.*?)",’,html,re.S)
objurlの後、すべての一致
ローカルコンピュータネットワークのヘッダーが見つかると、
一部のWebページをクロールできず、403エラーが表示されることがあります。これは、これらのWebページには、他のWebページが悪意を持って情報を収集するのを防ぐためのクローラー防止設定があるためです。
いくつかのヘッダー情報を設定し、それをブラウザーとしてシミュレートしてこれらのWebサイトにアクセスすると、この問題を解決できます。
まず、WebページのBaiduをクリックして、Webページでアクションを実行すると、図に示すように、下部のウィンドウに大量のデータが表示されます。
このとき、図のwww.baidu.comをクリックすると、図のように表示されます。
ヘッダーで、下にドラッグして
情報のユーザーエージェント文字列を見つけます。これは、以下のシミュレートされたブラウザーで使用される情報であり、コピーします。
すべてのコード
言語python
from urllib.parse import quote
import string
import re
from urllib import request
import urllib.request
word = input('关键词:')
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&ct=201326592&v=flip'
url = quote(url, safe=string.printable)# # 解决ascii编码报错问题,不报错则可以注释掉
#模拟成浏览器
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
#将opener安装为全局
urllib.request.install_opener(opener)
#读取网页
url_request=request.Request(url)
url_response = request.urlopen(url_request,timeout=10) # 请求数据,可以和上一句合并.表示一次http访问请求的时间最多10秒,一旦超过,本次请求中断,但是不进入下一条,而是继续重复请求这一条
html = url_response.read().decode('utf-8') # 加编码,重要!转换为字符串编码,read()得到的是byte格式的。
jpglist = re.findall('"thumbURL":"(.*?)",',html,re.S) #re.S将字符串作为整体,在整体中进行匹配。,thumbURL可以匹配其他格式的图
print(len(jpglist))
n = 1
for each in jpglist:
print(each)
try:
request.urlretrieve(each,'D:\\deeplearn\\xuexicaogao\\图片\\%s.jpg' %n) #爬下载的图片放置在提前建好的文件夹里
except Exception as e:
print(e)
finally:
print('下载完成。')
n+=1
if n==90:
break
print('结束')
コード分析
クローラーがエラーを報告しますUnicodeEncodeError: 'ascii'コーデックは位置45-47の文字をエンコードできません:序数ではありません...
理由Pythonのデフォルトのエンコードはasciiです。プログラムに非ASCIIエンコードが表示されると、python処理で報告されることがよくあります。このようなエラーUnicodeDecodeError: 'ascii'コーデックは位置1のバイト0x ??をデコードできません:序数は範囲(128)にありません、pythonは非asciiコードを処理できません、あなたは自分でpythonのデフォルトコードを設定する必要があります、通常はutf8エンコーディング形式に設定されます。
urllib.parse.quoteを使用して変換します。
結果フォルダ
コードバージョン2
言語のPython
import urllib
import urllib.request
from urllib.parse import quote
import re
import os
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36",
"referer": "https://image.baidu.com"
}
print("****************************************************************************************")
keyword = input("请输入要下载的图片:")
last_dir = "C://Users//Shineion//Desktop//爬虫图"
dir = "C://Users//Shineion//Desktop//爬虫图//" + keyword
if os.path.exists(last_dir):
if os.path.exists(dir):
print("文件夹已经存在")
else:
os.mkdir(dir)
print(dir + "已经创建成功")
else:
os.mkdir(last_dir)
if os.path.exists(dir):
print("文件夹已经存在")
else:
os.mkdir(dir)
print(dir + "已经创建成功")
keyword1 = quote(keyword, encoding="utf-8")
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + keyword1 + '&ct=201326592&v=flip'
req = urllib.request.Request(url, headers=headers)
f = urllib.request.urlopen(req).read().decode("utf-8")
key = r'thumbURL":"(.+?)"'
key1 = re.compile(key)
num = 0
for string in re.findall(key1, f):
print("正在下载" + string)
f_req = urllib.request.Request(string, headers=headers)
f_url = urllib.request.urlopen(f_req).read()
fs = open(dir + "/" + keyword + str(num) + ".jpg", "wb+")
fs.write(f_url)
fs.close()
num += 1
print(string + "已下载成功")
input("按任意键结束程序:")
問題への注意:コードが行き詰まりやすく、次の画像を取得するのに行き詰まってい
ます:電気-Yu Dengwu