大众好,我是润森
什么是爬虫
网络爬虫(又被叫作为网页蜘蛛,网络设备人,在FOAF社区中间,更经常的叫作为网页追逐者),是一种根据必定的规则,自动地抓取万维网信息的程序或脚本。另一有些不常运用的名字还有蚂蚁、自动索引、模拟程序或蠕虫。(源自: 百度百科)
爬虫协议
Robots协议(亦叫作为爬虫协议、设备人协议等)的全叫作是“网络爬虫排除标准”(Robots Exclusion Protocol),网站经过Robots协议告诉搜索引擎那些页面能够抓取,那些页面不可抓取。
robots.txt文件是一个文本文件,运用任何一个平常的文本编辑器,例如Windows系统自带的Notepad,就能够创建和编辑它。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中拜访网站的时候要查看的第1个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是能够被查看的。(源自: 百度百科)
爬虫百度照片
目的:爬取百度的照片,并保留电脑中 能不可爬?首要数据是不是公开?能不可下载?
从图中能够看出,百度的照片是完全能够下载,说明了照片能够爬取 先爬取一张照片
首要,明白照片是什么?
有形式的事物,咱们看到的,是图画、照片、拓片等的统叫作。图是技术制图中的基本术语,指用点、线、符号、文字和数字等描绘事物几何特征、形态、位置及体积的一种形式。随着数字采集技术和信号处理理论的发展,越来越多的照片以数字形式存储。
”
而后需要照片在哪里?
照片是在云服务器的数据库中的保留起来的
”
每张照片都有对应的url,经过requests模块来发起请求,在用文件的wb+方式来保留起来 import requests
r = requests.get(http://pic37.nipic.com/20140113/8800276_184927469000_2.png)
with open(demo.jpg,wb+) as f:
f.write(r.content)批量爬取
然则有谁为了爬一张照片去写代码,还不如直接去下载 。爬虫是目的便是为了达到批量下载的目的,这才是真正的爬虫
” 网站的分析首要认识json
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和暗示数据。简洁和清晰的层次结构使得 JSON 作为理想的数据交换语言。
”
json 便是js 的对象,便是来存取数据的东西
JSON字符串 {
“name”: “毛利”,
“age”: 18,
“ feature “ : [‘高’, ‘富’, ‘帅’]
}Python字典 {
‘name’: ‘毛利’,
‘age’: 18
‘feature’ :[‘高’, ‘富’, ‘帅’]
}
然则在python中不能够直接经过键值对来取得值,因此不得不谈谈python中的字典
”
导入python 中json,经过json.loads(s) -->将json数据转换为python的数据(字典)
ajax 的运用
Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),指的是一种创建交互式网页应用的网页研发技术。
”
照片是经过ajax 办法来加载的,亦便是当我下拉,照片会自动加载,是由于网站自动发起了请求,
分析照片url链接的位置
同期找到对应ajax的请求的url
构造ajax的url请求,来将json转化为字典,在经过字典的键值对来取值,得到照片对应的url import requests
import json
headers = {
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36}
r = requests.get(https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1561022599290=,headers = headers).text
res = json.loads(r)[data]
forindex,iin enumerate(res):
url = i[hoverURL]
print(url)
with open( {}.jpg.format(index),wb+) as f:
f.write(requests.get(url).content)
构造json的url,持续的爬取照片
在一个json 的有30张照片,因此发起一个json的请求,咱们能够爬去30张照片,然则还是不足。
”
首要分析区别的json中发起的请求 https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=60&rn=30&gsm=3c&1561022599355=
https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=1e&1561022599290=其实能够发掘,当再次发起请求时,关键便是那个 pn在持续的变动
最后封装代码,一个列表来定义生产者来存储持续的生成照片url,另一个列表来定义消费者来保留照片 # -*- coding:utf-8 -*-
# time :2019/6/20 17:07
# author: 毛利
import requests
import json
import os
def get_pic_url(num):
pic_url= []
headers = {
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36}
for i in range(num):
page_url = https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn={}&rn=30&gsm=1e&1561022599290=.format(30*i)
r = requests.get(page_url, headers=headers).text
res = json.loads(r)[data]
if res:
print(res)
for j in res:
try:
url = j[hoverURL]
pic_url.append(url)
except:
print(该照片的url不存在)
print(len(pic_url))return pic_url
def down_img(num):
pic_url =get_pic_url(num)
if os.path.exists(D:\照片):
pass
else:
os.makedirs(D:\照片)
path = D:\照片\\
for index,i inenumerate(pic_url):
filename = path + str(index) +.jpg
print(filename)
with open(filename, wb+) as f:
f.write(requests.get(i).content)
if __name__ == __main__:
num = int(input(爬取几次照片:一次30张))
down_img(num)
|