网页爬虫抓取百度图片(如何识别*敏*感*词*图片的url(图)参数(组图))
优采云 发布时间: 2021-12-10 09:09网页爬虫抓取百度图片(如何识别*敏*感*词*图片的url(图)参数(组图))
最近在玩机器学习,想建立一个识别*敏*感*词*图片的训练集。我因没有太多*敏*感*词*图片而苦恼。然后突然想到百度图片可以用,于是写了一个简单的爬虫抓取百度图片(图片关键词)html
第一步是找到搜索图像的 URL。
打开百度图片页面,搜索“高清*敏*感*词*”,查看元素,查看网络,清除网络请求数据,滚动到底部,看到自动加载更多,然后在里面找到加载更多数据的url网络请求。像这样%E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word= % E4%BA%8C%E6%AC%A1%E5%85%83&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=60&rn=30&gsm=1000000001e&81=
对比几个加载较多的URL,发现rn参数是每页显示的次数,pn参数是已经请求的次数。修改rn参数和pn参数后,观察返回的数据,发现每页最多只能有60个,也就是设置的最大rn为60.python
第二步是分析返回的数据。
浏览器请求上述url后,在页面上看到一个超级json。经过分析,图片的url是thumbURL middleURL hoverurl的三个属性。在返回的字符串中搜索这三个属性的数量,发现数量与页数完全相同。取这三个url,通过浏览器打开,发现thumburl比middleUrl大,和hoverUrl是同一个url。其实还是有objUrl(原图)可以用的,只是url不稳定,有时会得到404,有时会被拒绝访问。网络
代码代码
个人python版本为2.7json
2017 年 2 月 11 日更新
1.保存的图片改成原高清大图OjbUrl
2. 修改使用方法,可以从命令行输入搜索关键字
3.随时保存,保存前不再搜索所有图片。浏览器
百度ImageSearch.py微信
#coding=utf-8
from urllib import quote
import urllib2 as urllib
import re
import os
class BaiduImage():
def __init__(self, keyword, count=2000, save_path="img", rn=60):
self.keyword = keyword
self.count = count
self.save_path = save_path
self.rn = rn
self.__imageList = []
self.__totleCount = 0
self.__encodeKeyword = quote(self.keyword)
self.__acJsonCount = self.__get_ac_json_count()
self.user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
self.headers = {'User-Agent': self.user_agent, "Upgrade-Insecure-Requests": 1,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
"Cache-Control": "no-cache"}
# "Host": Host,
def search(self):
for i in range(0, self.__acJsonCount):
url = self.__get_search_url(i * self.rn)
response = self.__get_response(url).replace("\\", "")
image_url_list = self.__pick_image_urls(response)
self.__save(image_url_list)
def __save(self, image_url_list, save_path=None):
if save_path:
self.save_path = save_path
print "已经存储 " + str(self.__totleCount) + "张"
print "正在存储 " + str(len(image_url_list)) + "张,存储路径:" + self.save_path
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
for image in image_url_list:
host = self.get_url_host(image)
self.headers["Host"] = host
with open(self.save_path + "/%s.jpg" % self.__totleCount, "wb") as p:
try:
req = urllib.Request(image, headers=self.headers)
# 设置一个urlopen的超时,若是10秒访问不到,就跳到下一个地址,防止程序卡在一个地方。
img = urllib.urlopen(req, timeout=20)
p.write(img.read())
p.close()
self.__totleCount += 1
except Exception as e:
print "Exception" + str(e)
p.close()
if os.path.exists("img/%s.jpg" % self.__totleCount):
os.remove("img/%s.jpg" % self.__totleCount)
print "已存储 " + str(self.__totleCount) + " 张图片"
def __pick_image_urls(self, response):
reg = r'"ObjURL":"(http://img[0-9]\.imgtn.*?)"'
imgre = re.compile(reg)
imglist = re.findall(imgre, response)
return imglist
def __get_response(self, url):
page = urllib.urlopen(url)
return page.read()
def __get_search_url(self, pn):
return "http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=" + self.__encodeKeyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=" + self.__encodeKeyword + "&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=" + str(pn) + "&rn=" + str(self.rn) + "&gsm=1000000001e&1486375820481="
def get_url_host(self, url):
reg = r'http://(.*?)/'
hostre = re.compile(reg)
host = re.findall(hostre, url)
if len(host) > 0:
return host[0]
return ""
def __get_ac_json_count(self):
a = self.count % self.rn
c = self.count / self.rn
if a:
c += 1
return c
用例
运行.pyapp
#coding=utf-8
from BaiduImageSearch import BaiduImage
import sys
keyword = " ".join(sys.argv[1:])
save_path = "_".join(sys.argv[1:])
if not keyword:
print "亲,你忘记带搜索内容了哦~ 搜索内容关键字可多个,使用空格分开"
print "例如:python run.py 男生 头像"
else:
search = BaiduImage(keyword, save_path=save_path)
search.search()
ps:记得把_init_.py文件加到两个文件的同一个目录下!!!
运行方法,python run.py 关键字1 关键字2 关键字3……机器学习
一般搜索到1900多就没有了。svg