栄光の爬虫類の王

入門

Webクローラー(また、Webスパイダー、ウェブロボットとして知られ、FOAFコミュニティの途中で、より頻繁にウェブチェイサーと呼ばれる)、ワールド・ワイド・ウェブのプログラムやスクリプトで自動的にグラブ情報、フォロー一定のルールのようなものです。Pythonは、クロスプラットフォームのコンピュータプログラミング言語です。もともと自動スクリプト(シェル)を書き込むために設計された動的型付けオブジェクト指向言語では、常に新しい機能や言語バージョンを追加して更新され、複数の独立した、大規模な開発プロジェクトのために使用されています。Pythonでネットワークのクローラが簡単かつ迅速ですので。

要求分析

実際には、王栄YaoguanネットワークHDの壁紙をクロールすることです。
図1:栄光のスクリーンショットの王
スクリーンショットに示すように、20ページあたりの高品質画像、21の合計があります。目的は、仕事にPythonの一括ダウンロードを使用して、これらの21 400張Gaoqing写真です。

爬虫類のプロセス:
ここに画像を挿入説明

Web分析

クロール絵は、これらの画像を分析する前に、目的は、画像のURLを得ることです。
キング栄Yaoguanネットワークでは、F12キーを押しは、要素のプロパティを開き、私のブラウザは、Firefoxがあります。以下に示すように、壁紙は、異なるサイズのことがわかる。
ここに画像を挿入説明
これらは、同様のURLです:
チェーンが失敗し、[イメージダンプ、発信局は、直接アップロード(IMG-QkiPFOmd-1582181234847ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです)(2E0C1A7EF9C6475FA78ECF3D9B386EBF)]

次のように2つのスケールは、URLリスト:

http://shp.qpic.cn/ishow/2735011316/1578903461_84828260_30369_sProdImgNo_3.jpg/0

http://shp.qpic.cn/ishow/2735011316/1578903461_84828260_30369_sProdImgNo_2.jpg/0

これにより違いProdImgNo_3 ProdImgNo_2と異なるスケールの画像間の違いを見ることが唯一喜んで。キング栄Yaoguanネットワークは、7つの異なるスケールを提供します。
[画像のダンプはチェーンが失敗し、発信局は、直接アップロード(IMG-7jweEAUI-1582181234852)(下の画像を保存することが推奨され、セキュリティチェーン機構を有していてもよい D1001D4E48C44498A9E3A9CFF6E0E7B3)]。

クロール過去の経験に基づいて、ウェブサイトのURLの画像は、ソースコード中に置かれますが、データファイル上の、またはファイル内のURLのファイルを構成する情報が含まれているので、あなたは、これらのファイルを結合する必要がされることはありません完全な画像のURL。

所以,下一步就是查询图片的信息所包含的文件。在firefox中有一个网络选项,点击就可以查看图片相关信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qU4AYUZD-1582181234856)(473610BCD7B148EDB8942D5A114F9473)]
在消息头中包含着图像请求网址,例如:

http://shp.qpic.cn/ishow/2735011316/1578903461_84828260_30369_sProdImgNo_2.jpg/0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53D3Xr8K-1582181234862)(70F8967A654A40D4AF6CDFDD981259BE)]
每一张图片最特殊的就是最后如图蓝色线划出来的,每一张图都不一样。也就是

/2735011316/1578903461_84828260_30369_sProdImgNo_2.jpg/0

这样的图片名回报存在某个文件中,所以接下来就是找到这个文件。复制这个文件的某个数字如1578903461在调试器中搜索。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvrv3HrM-1582181234870)(096814F8DB134468A2B70B5B6754DCA5)]
包含图像url的文件,但是不方便查看,所以换种方式查兰
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pEFnvHbC-1582181234874)(26A21C7449124D65A92566F13883BF82)]

在搜索结果页面中点左键获取源地址网址如下:

https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=0&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17102680533382681486_1582174063967&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1582174064247

这个网址的结果是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKR8jlVc-1582181234894)(BABAF0306C524AC8B3F0777C06F0B552)]
这个网页中等于一页的20张图片,并且包含了7种不同的尺寸。但是这不能直接用,因为官方对其图片网址进行了编码,所有的特殊符号都变成了十六进制。所以对这些图片进行解码才能图片链接解码的python代码如下:

import urllib.parse
url='http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735092412%2F1569299550%5F84828260%5F31469%5FsProdImgNo%5F4%2Ejpg%2F200'
image_none=urllib.parse.unquote(url,'utf-8')#解码

#结果:
>>>'http://shp.qpic.cn/ishow/2735092412/1569299550_84828260_31469_sProdImgNo_4.jpg/200'

仔细观察这一个图像的URL,在浏览器中打开得到的图像很小,别提什么高清了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0NcrN1C-1582181234896)(2397A41FD9EC4AB992E290AA2F1BF791)]
经过对网页源代码的分析:
网页源代码可以看到这样一段代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XwbCQM2g-1582181234897)(37013E4FD490491D9B4665B5BA94CDBD)]

所以需要使用0代替掉图像url尾部的200结果就是正常的高清图片了。

'http://shp.qpic.cn/ishow/2735092412/1569299550_84828260_31469_sProdImgNo_4.jpg/200'

替换为
'http://shp.qpic.cn/ishow/2735092412/1569299550_84828260_31469_sProdImgNo_4.jpg/0'

就此,通过上述步骤可获取了一页中20张壁纸的url。可以写一个简单的代码去爬取这一页的壁纸如下:

#导入库
import requests
from bs4 import BeautifulSoup as BS
import re 
import urllib.request
import urllib.parse
import os
import json
import csv
from datetime import datetime
import time
#下载链接
r=requests.get('https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=1&iOrder=0&iSortNumClose=1&jsoncallback=&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=').text
#网页解析出一张图片的url,这里我只下载尺寸为1920×120的图片。
image_ur=set()
image_list=re.compile('(http(%\w*)*)').findall(r)
for i in image_list:
    image_none=urllib.parse.unquote(i[0],'utf-8')
    image_none=re.sub('sProdImgNo_[0-9]','sProdImgNo_7',image_none)
    image_ur.add(re.sub('200','0',image_none))
#保存图像
num=100
for i in image_ur:
    with open('F://wz/'+str(num)+'.jpg','wb') as f:
        r=requests.get(i)
        if r.status_code==200:
          f.write(r.content)
          print('{}finish'.format(num))
          num+=1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DqU1yYz4-1582181234899)(0551848E3DE642EE80D128C288E293DA)]

所以只要有一个图像源网址就能下载一页的壁纸

https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=0&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17102680533382681486_1582174063967&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1582174064247

但是20页每次都得重新去获取,明显称不上自动,更别说20页还是有点麻烦。接下来的工作就是考虑如何生成源网址。

经过通过对多页源网址比较,并分析相关的js代码,找出的规律如下:

page_3=https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=3&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17109236554684578916_1581341758935&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1581342827129
page_8=https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=8&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17109236554684578916_1581341758931&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1581341852604
page_9=https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=9&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17109236554684578916_1581341758932&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1581341854233

_変更はあり三つのパラメータは、ページ、jsoncallbackと最終的にはそこにあります。分析の後、ページ番号は各ページに対応します。下線は_ jsoncallbacがランダムに生成された番号であり、タイムスタンプです。テスト済み_削除とjsoncallbackパラメータは、ソースURLへの通常のアクセスまま。次のようにだから修正アルキ検索ページ値は、元のページのURLに対応することができます。

https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=1&iOrder=0&iSortNumClose=1&jsoncallback=&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_='

バリューjsoncallbackと_ライン上の左のブランク。したがって、私たちは、完全な画像のURLを構築することができるようになります。

ソースURLのURLを取得するために正規表現を使用することに加えて

あなたいったんページのURLと、分析をダウンロードする必要があります。7つのサイズ元URLの画像が含まれているため、私は1920×1200で、最大必要
再びいくつかのPythonライブラリをインストールする前に:

ライブラリリクエストURLに対する要求、およびダウンロード写真は、関連するライブラリの使用を参照してくださいここに

画像のダウンロードコード上:

#r是源网址使用requests模块下载
r=requests.get('https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=1&iOrder=0&iSortNumClose=1&jsoncallback=&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=').text
#提取出每一张图片的url
image_ur=set()#用于去重
image_list=re.compile('(http(%\w*)*)').findall(r)#用正则表达式提取出每一张图片。
for i in image_list:#遍历每一条url将所有的尺寸替换为sProdImgNo_7即1920×1200并去重
    image_none=urllib.parse.unquote(i[0],'utf-8')
    image_none=re.sub('sProdImgNo_[0-9]','sProdImgNo_7',image_none)
    image_ur.add(re.sub('200','0',image_none))#将200用0替代。

あなたは、正規表現の使用方法を理解していない場合を見て

保存画像

ダウンロードして保存する画像のURLを取得した後。ティーチにも彼のような良い方法がある場合requests.get()。コンテンツは、あなたが直接JPG形式として保存ダウンロードできるようにした後、バイナリモードで得られるため。

#保存图像
num=100
for i in image_ur:
    with open('F://wz/'+str(num)+'.jpg','wb') as f:
        r=requests.get(i)
        if r.status_code==200:
          f.write(r.content)
          print('{}finish'.format(num))
          num+=1
     print('完成{}的下载'.format(i))

その他のダウンロードよりキングHDの壁紙のすべての栄光完了です。見て、完全なバッチコードのダウンロード
コードを

リリース5元の記事 ウォンの賞賛1 ビュー1262

おすすめ

転載: blog.csdn.net/KIDD5433/article/details/104410672