关于爬虫
url='https://image.baidu.com/search/index?ct=201326592&cl=2&st=-1&lm=-1&nc=1&ie=utf-8&tn=baiduimage&ipn=r&rps=1&pv=&fm=rs7&word=%E9%9E%A0%E5%A9%A7%E7%A5%8E%E5%A3%81%E7%BA%B8%E9%AB%98%E6%B8%85&oriquery=%E9%9E%A0%E5%A9%A7%E7%A5%8E&ofr=%E9%9E%A0%E5%A9%A7%E7%A5%8E&sensitive=0'大佬们帮忙写个爬虫爬取这个网址的图片,不要用selenium, 本帖最后由 suchocolate 于 2020-9-6 13:55 编辑
百度图片搜索下载一般是通用的。
# _*_ coding: utf-8 _*_
# Developer: suchcoolate
# Date: 6/28/2020 09:25
# File name: baidu_pic_search_downloader.py
# Development tool: PyCharm
import requests
import os
def main():
# name = input('请输入百度图片搜索关键词:')
name = '鞠婧祎壁纸高清'
# num = int(input('请输入想下载的页数:'))
num = 2
# dir_name = input('请输入图片存放文件夹名称:')
dir_name = 'pics'
result_list = [] # 存储图片url
headers = {'user-agent': 'firefox', 'X-Requested-With': 'XMLHttpRequest'}
ajax_url = 'https://image.baidu.com/search/acjson?'
data = {
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'queryWord': name,
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '-1',
'z': '',
'ic': '0',
'hd': '',
'latest': '',
'copyright': '',
'word': name,
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': '0',
'istype': '2',
'qc': '',
'nc': '1',
'fr': '',
'expermode': '',
'force': '',
'pn': '30',
'rn': '30',
'gsm': ''
}
# 解析获取到的json数据,把图片url收集起来
for item in range(1, num + 1):
r = requests.get(ajax_url, headers=headers, params=data)
j_data = r.json()
for j in j_data['data'][:-1]:
# 有的url可能是空的,跳过
if not j['hoverURL']:
continue
result_list.append(j['hoverURL'])
data['gsm'] = j_data['gsm']
data['pn'] = str(30 * (item + 1))
# print(result_list) # 打印所有图片url
# 检查文件夹是否存在
if not os.path.exists(dir_name):
os.mkdir(dir_name)
os.chdir(dir_name)
# 下载图片
counter = 1 # 计数器
for item in result_list:
# print(counter, item)
r = requests.get(item, headers=headers)
# 图片名称
pic_name = item.split('/')[-1]
with open(pic_name, 'wb') as f:
f.write(r.content)
print(f'已下载{pic_name},共下载{counter}张。')
counter += 1
if __name__ == '__main__':
main()
{:5_99:}四千年的美女 本帖最后由 疾风怪盗 于 2020-9-6 15:44 编辑
试试看这个
import requests
import json
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
img_list = []
for i in range(0,10):
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=鞠婧祎&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=鞠婧祎&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&force=&pn='
url=url+str(i*30)
print(url)
reponse = requests.get(url=url, headers=headers)
json_data = json.loads(reponse.content.decode())
json_data = json_data['data']
# print(json_data)
for i in range(0, len(json_data) - 1):
img_url = json_data['hoverURL']
#print(img_url)
img_list.append(img_url)
print(img_list)
疾风怪盗 发表于 2020-9-6 15:38
试试看这个
最前面的图片不是ajax请求获取的,数据在图中的app.setData里面,不用正则怎么弄出需要的数据尼,主要是没见过这种,想了解下
suchocolate 发表于 2020-9-6 13:38
百度图片搜索下载一般是通用的。
兄嘚少了前30张图片,前30张图不是ajax请求获得的,我想知道的重点是这30张图片怎么弄下来 tiger吴 发表于 2020-9-6 21:37
最前面的图片不是ajax请求获取的,数据在图中的app.setData里面,不用正则怎么弄出需要的数据尼,主要是 ...
再刷个几页,就会出现acjson开头的json数据了,然后找地址规律,发现有个数字是变化的,0,30,60,90,就可以构造网址了,获取json数据比xpath要方便很多,数据也比较全 tiger吴 发表于 2020-9-6 21:44
兄嘚少了前30张图片,前30张图不是ajax请求获得的,我想知道的重点是这30张图片怎么弄下来
{:5_99:}现在一看,好像是少了前30张。。。。。。。。。那就用正则呗 tiger吴 发表于 2020-9-6 21:44
兄嘚少了前30张图片,前30张图不是ajax请求获得的,我想知道的重点是这30张图片怎么弄下来
这样就可以了
import requests
import json
import re
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
url = 'https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E9%9E%A0%E5%A9%A7%E7%A5%8E'
reponse = requests.get(url=url, headers=headers)
data = reponse.content.decode()
print(data)
partten='"hoverURL":"(.*?)"'
img_url_list=re.findall(partten,data)
print(img_url_list)
print(len(img_url_list))
帮你获取了四千年美女图,给个最佳吧,少年{:5_108:} tiger吴 发表于 2020-9-6 21:44
兄嘚少了前30张图片,前30张图不是ajax请求获得的,我想知道的重点是这30张图片怎么弄下来
已更新
# _*_ coding: utf-8 _*_
# Developer: suchcoolate
# Date: 6/28/2020 09:25
# File name: baidu_pic_search_downloader.py
# Development tool: PyCharm
import requests
import os
import re
def main():
# name = input('请输入百度图片搜索关键词:')
name = '鞠婧祎高清壁纸'
# num = int(input('请输入想下载的页数:'))
num = 2
# dir_name = input('请输入图片存放文件夹名称:')
dir_name = 'pics'
result_list = [] # 存储图片url
index_headers = {'user-agent': 'firefox'}
ajax_headers = {'user-agent': 'firefox', 'X-Requested-With': 'XMLHttpRequest'}
index_url = 'https://image.baidu.com/search/index?'
index_params = {
'tn': 'baiduimage',
'ipn': 'r',
'ct': '201326592',
'cl': '2',
'lm': '-1',
'st': '-1',
'fm': 'index',
'fr': '',
'hs': '0',
'xthttps': '111111',
'sf': '1',
'fmq': '',
'pv': '',
'ic': '0',
'nc': '1',
'z': '',
'se': '1',
'showtab': '0',
'fb': '0',
'width': '',
'height': '',
'face': '0',
'istype': '2',
'ie': 'utf-8',
'word': name,
'oq': name,
'rsp': '-1'
}
ajax_url = 'https://image.baidu.com/search/acjson?'
ajax_params = {
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': '201326592',
'is': '',
'fp': 'result',
'queryWord': name,
'cl': '2',
'lm': '-1',
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': '-1',
'z': '',
'ic': '0',
'hd': '',
'latest': '',
'copyright': '',
'word': name,
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': '0',
'istype': '2',
'qc': '',
'nc': '1',
'fr': '',
'expermode': '',
'force': '',
'pn': '30',
'rn': '30',
'gsm': ''
}
# 获取首页图片
r = requests.get(index_url, headers=index_headers, params=index_params)
result = re.findall('"hoverURL":"(.*?)"', r.text)
result_list.extend(result)
# 解析获取到的json数据,把图片url收集起来
for item in range(1, num + 1):
r = requests.get(ajax_url, headers=ajax_headers, params=ajax_params)
j_data = r.json()
for j in j_data['data'][:-1]:
if not j['hoverURL']:
continue
result_list.append(j['hoverURL'])
ajax_params['gsm'] = j_data['gsm']
ajax_params['pn'] = str(30 * (item + 1))
# print(result_list) # 打印所有图片url
# 检查文件是否存在
if not os.path.exists(dir_name):
os.mkdir(dir_name)
os.chdir(dir_name)
# 下载图片
counter = 1 # 计数器
for item in result_list:
# print(counter, item)
r = requests.get(item, headers=index_headers)
# pic_name是图片名称
pic_name = item.split('/')[-1]
with open(pic_name, 'wb') as f:
f.write(r.content)
print(f'已下载{pic_name},共下载{counter}张。')
counter += 1
if __name__ == '__main__':
main()
有一个库helium,基于Selenium基础上的更加高级的web自动化工具 首先把链接贴在这里,可以去看看,非常好的一个库,用法也简单
链接:https://mp.weixin.qq.com/s/XvC-R0WUSqF7DokTJe2cpw bonst 发表于 2020-9-7 12:16
首先把链接贴在这里,可以去看看,非常好的一个库,用法也简单
链接:https://mp.weixin.qq.com/s/XvC-R0W ...
额,这种不太适合学习者用吧 看你做啥子,反正我觉得可以,节省工作,之前用哪个requests库做这种工作感觉不如这个简单
页:
[1]