网页爬虫抓取百度图片(如何识别*敏*感*词*图片的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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线