写个爬虫,抓点百度图片。本程序基于python3编写,可根据关键词抓取百度图片
下载的图片:
代码:
import json
import os
import random
import time
import re
import easygui
from urllib import request, parse
# 图片保存路径
PATH = '图片/百度/'
os.makedirs(PATH, exist_ok=True)
# 获取每页数据
def get_page_data(keyword, page=1, charset='utf-8'):
pn = page * 30 # 每页图片数
gsm = hex(pn) # 每页图片数16进制表示
keyword = parse.quote(keyword) # 关键词url转码
url = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=' + keyword + '&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&word=' + keyword + '&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&pn=' + str(pn) + '&rn=30&gsm=' + str(gsm)
req = request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36')
return request.urlopen(req).read().decode(charset)
# 搜索图片
def search(keyword, pages=1):
for page in range(1, pages + 1):
page_data = ''
try:
page_data = get_page_data(keyword, page)
except Exception as e:
print(e)
if not page_data:
continue
obj = json.loads(page_data) # 将数据转换为json对象
images = obj['data'] # 获取图片列表
for image in images:
if image:
src = image['thumbURL'] # 图片地址
suffix = src[src.rfind('.'):] # 图片后缀
title = re.sub('\W+', '', image['fromPageTitleEnc']) # 图片标题
image_path = PATH + title + str(int(time.time())) + str(random.randint(10000, 99999)) + suffix # 文件名
req = request.Request(src)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36')
req.add_header('Referer', 'http://image.baidu.com/i?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&word=%E4%BA%A4%E9%80%9A&ie=utf-8')
try:
image_data = request.urlopen(req).read()
f = open(image_path, 'wb')
f.write(image_data)
f.close()
print(src + ' 下载完成')
except Exception as e:
print(e)
__keyword, __pages = easygui.multenterbox('请输入搜索信息', '图片下载器', ['关键词', '下载页数'])
search(__keyword, int(__pages))
顺便用pyinstaller编译个exe程序,源码及exe压缩包下载地址:http://download.csdn.net/detail/u013314786/9721220