python爬取百度迁徙动态图_爬取动态图片—以百度图片为例

一:何谓动态加载图片

所谓动态加载图片即指html刚加载时,图片时没有的,然后通过json发生有关图片的数据,在插入到html里面去,以到底快速打开网页的目的,那么问题来了?我们如何找到加载文件的json文件呢?而这个问题正是我们实现爬取百度图片的第一步,让小可爱告诉你怎么做吧。

14a42bfbe7b8d567a7f5d0a24d920e38.png

我们以表情包这个关键字为例,如下图

1c52869c2915c9f7288135ebf7fcb259.png

小可爱在百度图片搜索表情包来到上图页面,然后按F12来到开发者页面,

b1b4d6739396825a225c62fc0c255cf5.png

我们点击二个json文件 如:

②https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E8%A1%A8%E6%83%85%E5%8C%85&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E8%A1%A8%E6%83%85%E5%8C%85&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=60&rn=30&gsm=3c&1523454876394=

两个链接的第一处和第二处标红处为关键字word的编码格式,可以用urllib.parse.unquote()解码,第二个为每次涮新的步长,计算为rm+上一个pn

我们在看看链接的内容吧

0b2dc5d91e4bbd4e2fb79b9d924a47f5.png

这里你只要记住我们要找的图片链接为objURL就行,可以通过re模块compile与find_all方法找出这个json文件的所有objurl,有了这些objurl,到了这里我们就离成功爬取百度图片不远了。ps由于百度图片的objurl加密了,所以解密过程就不解释了。

接着小可爱便附上我们的完整代码import json

import itertools

import urllib

import requests

import os

import re

import sys

word=input("请输入关键字:")

path="F:/maps"

if not os.path.exists(path):

os.mkdir(path)

word=urllib.parse.quote(word)

#该URL地址不是网页的URL地址,而JSON地址

url = r"http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&fp=result&queryWord={word}&cl=2&lm=-1&ie=utf-8&oe=utf-8&st=-1&ic=0&word={word}&face=0&istype=2nc=1&pn={pn}&rn=60"

urls=[url.format(word=word,pn=x*60)for x in range(0,100)]

index=0

str_table = {

'_z2C$q': ':',

'_z&e3B': '.',

'AzdH3F': '/'

}

char_table = {

'w': 'a',

'k': 'b',

'v': 'c',

'1': 'd',

'j': 'e',

'u': 'f',

'2': 'g',

'i': 'h',

't': 'i',

'3': 'j',

'h': 'k',

's': 'l',

'4': 'm',

'g': 'n',

'5': 'o',

'r': 'p',

'q': 'q',

'6': 'r',

'f': 's',

'p': 't',

'7': 'u',

'e': 'v',

'o': 'w',

'8': '1',

'd': '2',

'n': '3',

'9': '4',

'c': '5',

'm': '6',

'0': '7',

'b': '8',

'l': '9',

'a': '0'

}

i=1

char_table = {ord(key): ord(value) for key, value in char_table.items()}

for url in urls:

html=requests.get(url,timeout=10).text

#设置编译格式

a=re.compile(r'"objURL":"(.*?)"')

downURL=re.findall(a,html)

for t in downURL:

#解码

for key, value in str_table.items():

t = t.replace(key, value)

t=t.translate(char_table)

try:

html_1=requests.get(t)

if str(html_1.status_code)[0]=="4":

print('失败1')

continue

except Exception as e:

print('失败2')

continue

#下载

with open(path+"/"+str(i)+".jpg",'wb') as f:

f.write(html_1.content)

i=i+1

下面两个分别是小可爱自己原创编写的爬取蜂鸟网和汇图网的爬虫代码,

汇图网爬虫;import re

import requests

import os

import urllib

header= {'content-type': 'application/json',

'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}

url="http://soso.huitu.com/Search/GetAllPicInfo?perPageSize=102&kw={word}&page={num}"

word=input("请输入关键字:")

word=urllib.parse.quote(word)

urls=[str(url).format(word=word,num=x)for  x in  range(1,2)]

i=1

for url in urls:

print(url)

html=requests.get(url).text

print(html)

r=re.compile(r'"imgUrl":"(.*?)"')

u=re.findall(r,html)

for s in u:

htmls=requests.get(s)

with open("F:\\im\\"+str(i)+".jpg",'wb')as f:

f.write(htmls.content)

i=i+1

蜂鸟网爬虫:import re

import requests

import os

import itertools

url="http://photo.fengniao.com/ajaxPhoto.php?action=getPhotoLists&fid=595&sort=0&page={num}"

i=1

path="F:\\fengniao"

if not os.path.exists(path):

os.mkdir(path)

urls = [url.format(num=x) for x in range(1,100)]

for url in urls:

html = requests.get(url).text

r=re.compile(r'"image":"(.*?)"')

u=re.findall(r, html)

for downurl in u:

downurl=str(downurl).replace("\\","").split("?")[0]

htmls=requests.get(downurl)

with open(path+"\\"+str(i)+".jpg",'wb') as f:

f.write(htmls.content)

i=i+1

print(downurl)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值