|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
举例说明一下喔,百度搜索 mm 图片,然后百度图片里面就出来了好多图片。这里就不贴图了,自行脑补。
chrome在搜索出来的图片页面点击检查
如上图,点击 Network,点击 XHR,刷新页面,就会发现几个 acjson?tn=resultjson_com 的文件
在搜索结果那个页面往下滑,就会更多的 acjson?tn=resultjson_com 的文件
点击其中一个,右侧有网址,Request URL,打开
哇,里面好多 .jpg 格式的文件!!!
可是,为什么就这几个.jpg 文件呢
返回刚才的页面,一次对比每一个 acjson?tn=resultjson_com 开头的文件的 Request URL,神似有没有
唯一不同的是这个部分
30, 60, 90, 120...
等等,这不会就是传说中的等差数列吧?(红色圈圈后面的字符去掉,也可以导向到网页的,删掉后面的东西就可以了,应该是的)
盲猜是加载第几张到第几张图片用的
那么
for loop 一下,每次 open 一下 URL,那岂不是
所以,授人以鱼不如授人以渔
接下来要开始写代码了
在刚才的浏览器页面中,我们滑到最底下,会发现上图中的数据
那么久开始根据这些数据来写代码啦~
一共有三个 python 文件,请放置在同一个路径下~请尽量使用相同的文件名,或者请更改模块调用时的文件名,否则将会报错
spider.pyimport json, requests, ssl
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Accept': 'text/html'
}
def get_image_link(url):
ssl._create_default_https_context = ssl._create_unverified_context
r = requests.get(url, headers=headers).text
res = json.loads(r)['data']
link_list = []
for each in res:
try:
link_list.append(each['thumbURL']) # 从字典里找到 thumbURL 对应的值,即 .jpg 文件对应的路径,并且放进 list 里面
except KeyError:
pass
return link_list
if __name__ == '__main__':
url = input('enter\n')
get_image_link(url)
save_image.pyimport os, random, time, random, spider
import urllib.request as u_request
def save(new_pic):
folder = 'image'
try:
if folder not in os.getcwd(): # 如果文件夹不存在,则创建并前往文件夹;否则将创建一个随机的文件夹并进入
os.mkdir(folder)
os.chdir(folder)
except FileExistsError:
random1 = round(random.uniform(0,1),8)
folder += str(random1)
os.mkdir(folder)
os.chdir(folder)
count = 0
for each in new_pic:
try:
req = u_request.Request(each, headers = spider.headers)
response = u_request.urlopen(req)
cat_image = response.read()
filename = each.split('/')[-1]
with open(filename,'wb') as f:
f.write(cat_image)
print(each)
except OSError as error:
print(error)
continue
except ValueError as error:
print(error)
continue
sleep_time = round(random.uniform(0,0.05),5)
time.sleep(sleep_time)
count += 1
print("successful: " + str(count) + '/' + str(len(new_pic)))
baidu_spider_main.pyimport requests
from urllib.parse import urlencode
import spider, save_image, time, random
name = input("请输入您需要爬取的图片信息:\n")
pages = input("请输入您想要下载的页数:\n")
while not pages.isdigit():
pages = input("请重新输入您想要下载的页数:\n")
bef_url = 'https://image.baidu.com/search/index?'
data = {
'tn': 'resultjson_com',
'logid': '7786358177497367672',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'queryWord': '',
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '-1',
'z': '',
'ic': '',
'hd': '',
'latest': '',
'copyright': '',
'word': '',
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': '0',
'istype': '2',
'qc': '',
'nc': '1',
'fr': '',
'expermode': '',
'force': '',
'pn': '0',
'rn': '30',
'gsm': '1e',
'1561022599290': '' # 时间戳
}
if __name__ == '__main__':
for each in range(30, int(pages), 30):
millis = int(round(time.time() * 1000)) # 生成时间戳
data['word'] = name # 搜索关键词
data['queryWord'] = name # 搜索关键词
data['pn'] = each # 翻页
data.popitem() # 去掉最后一个元素,即旧的时间戳
data[millis] = '' # 添加新的时间戳
hex_num = hex(each)[2:]
data['gsm'] = hex_num
url = bef_url + urlencode(data)
image_list = spider.get_image_link(url)
save_image.save(image_list)
sleep_time = round(random.uniform(0.5,2),4)
time.sleep(sleep_time) #设置一个睡眠时间
|
|