百度爬虫
使用技术
安装requests模板
pip install requests
实现目标
- 可以通过控制台输入爬取图片类型
- 指定爬取图片数量
- 保存本地
页面分析
-
由于不存在翻页,但是可以通过向下滑动加载更多的图片,所以可以猜测为ajax请求
-
通过Chrome的开发者工具(F12)查看浏览器发出的ajax请求
http://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=-1&z=&ic=0&word=美女&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&cg=girl&pn=30&rn=30&gsm=1e&1532507052956=
由此可以发现请求链接,浏览器单独访问得到对应的json数据如下图:
都是乱码看的还是非常头疼,不过没关系,爬虫的神器www.json.cn进行json数据的解析
这样数据格式就很清晰了,可以发现有一个数据中包含了几个相同的url,这并不妨碍提取数据,选取thumbURL 的url数据进行提取
url规则提取
上面获取的url地址太过复杂,不方便我们使用,我们可以通过不断删减已达到简化url的目的,最后得到如下url地址,返回的数据和原链接返回的数据相同
https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&rn=60&word=%E7%89%B9%E6%96%AF%E6%8B%89&pn=0
根据不断尝试,可以发现,rn代表传输多少数据,最大为60,pn代表从第几个数据显示
word表示搜索的图片类型
开始编程
首先导入模块, requests用户发送请求,re用于提取图片url, hashlib模板使用md5进行设置唯一文件名
温馨提示: 由于多线程,请求非常迅速容易被封ip,建议加上睡眠时间, 线程虽好不要太放纵
import requests
from threading import Thread
import re
import time
import hashlib
class BaiDu:
"""
爬取百度图片
"""
def __init__(self, name, page):
self.start_time = time.time()
self.name = name
self.page = page
#self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&rn=60&'
self.url = 'https://image.baidu.com/search/acjson'
self.header = {}# 添加为自己的
self.num = 0
def queryset(self):
"""
将字符串转换为查询字符串形式
"""
pn = 0
for i in range(int(self.page)):
pn += 60 * i
name = {'word': self.name, 'pn': pn, 'tn':'resultjson_com', 'ipn':'rj', 'rn':60}
url = self.url
self.getrequest(url, name)
def getrequest(self, url, data):
"""
发送请求
"""
print('[INFO]: 开始发送请求:' + url)
ret = requests.get(url, headers=self.header, params=data)
if str(ret.status_code) == '200':
print('[INFO]: request 200 ok :' + ret.url)
else:
print('[INFO]: request {}, {}'.format(ret.status_code, ret.url))
response = ret.content.decode()
img_links = re.findall(r'thumbURL.*?\.jpg', response)
links = []
# 提取url
for link in img_links:
links.APPend(link[11:])
self.thread(links)
def saveimage(self, link):
"""
保存图片
"""
print('[INFO]:正在保存图片:' + link)
m = hashlib.md5()
m.update(link.encode())
name = m.hexdigest()
ret = requests.get(link, headers = self.header)
image_content = ret.content
filename = './image/' + name + '.jpg'
with open(filename, 'wb') as f:
f.write(image_content)
print('[INFO]:保存成功,图片名为:{}.jpg'.format(name))
def thread(self, links):
"""多线程"""
self.num +=1
for i, link in enumerate(links):
print('*'*50)
print(link)
print('*' * 50)
if link:
# time.sleep(0.5)
t = Thread(target=self.saveimage, args=(link,))
t.start()
# t.join()
self.num += 1
print('一共进行了{}次请求'.format(self.num))
def __del__(self):
end_time = time.time()
print('一共花费时间:{}(单位秒)'.format(end_time - self.start_time))
def main():
name = input('请输入你要爬取的图片类型: ')
page = input('请输入你要爬取图片的页数(60张一页):')
baidu = BaiDu(name, page)
baidu.queryset()
if __name__ == '__main__':
main()
爬取的数据
相关阅读
对SEOer来说,新做好的网站如何让百度更快的收录,这是大家普遍关心的问题。做优化的最终目的是实现网站盈利,而要实现盈利就必须把网
前台使用ajax上传图片,后台 node.js 使用 formidable
相信现在很多小伙伴在使用node来搭建后台,那么前后台对接少不了的就是图片的上传,下面我将通过这篇文章来对图片上传问题进行详细的
Lazyload长页面图片的延迟加载: 一,jquery.lazyload.js 注意事项:jquery.js务必先引进,然后才加载lazyload;img长宽一定要有,每幅长宽
PanDownload网页版全平台百度网盘资源免费高速下载解
声明:PanDownload!!! 注意:不需要登录百度网盘账号,不用担心账号、IP限速。 方式一(通过PanDownload网页版进行下载) 通过PanDownload网
音视频直播LSS(Live Streaming Service)是一个直播PaaS服务平台,旨在帮助企业及个人开发者快速搭建自己的直播平台及应用,关于LSS的相