クローラーの実際の戦闘:Baiduキーワードを使用して多数の写真をクロールします

ターゲットアドレス: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=&copyright=&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

おすすめ

転載: blog.csdn.net/kobeyu652453/article/details/112699472