|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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.py
- import 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.py
- import 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.py
- import 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) #设置一个睡眠时间
复制代码 |
|