python 爬虫系列-入门教程(2)😄
个人吐槽
写完第一篇之后发现爬回来的图片只有30多张
小老弟,不是至少应该几百张吗,这么不给面子的吗??
自暴自弃(冷静思考),原来网页是瀑布流的,不下拉滚动条不会请求更多的图片,一开始初始化页面只加载了30多张的图片,解析网页img 元素只能得到几十张, 所以改了下代码,顺便写了入门爬虫下篇(ps:我是不是很棒棒,坚信念念不忘,必有回响)
前言
想编写爬虫还是要有点编程基础的,没基础的可以先看看下面的基础(关键词)资料,并且自行百度谷歌。
1 python 基本语法,json ,网络请求分析
python 类,方法,变量(类比java)
2 使用谷歌浏览器按f12 刷新页面 查看网络请求接口(xhr),(怕小白不懂怎么看,老司机快速略过) 调试器说明
3 本篇教程爬虫的难度比较低,实际使用中很多网站都有防盗链或者加密措施,等你懂得基本编码之后,难点和核心就是:分析网站,找到符合我们心意的接口或者网页元素进行解析
4 python 解析json,(官方自带模块,不用另外安装),python3 安装语法 ,python 文件运行 请查看上篇教程前言
5 单击访问,观看接口数据格式:https://unsplash.com/napi/search/photos?query=girl&xp=&per_page=18461&page=1
demo
作为一枚钢铁直男,爬取关键词当然是(girl) ,你要是想设置为boy,我一点意见都没有。
'''
上篇文章,是为了快速入门和获得成就感,只能爬几十张,解析了首页初始化的dom 元素,后面的瀑布流图片没有爬到
在进入第2个demo 之前先快速刷了一遍python基础语法,(我有前端和java 的基础,阅读难度比较低)
第二份代码:
1 使用类,优化代码
2 爬取瀑布流更多图片,更实用,不再是解析dom 元素,而是直接解析接口返回json 结果
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
'''
import requests
import os
import time
import json
'''
爬取https://unsplash.com/ 上的美女图片
'''
class PicSpider:
# 头部
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
# 官网地址
weburl:''
def __init__(self,weburl):
self.weburl=weburl
# 保存图片
def save_img(self,url):
print('开始保存图片...')
print(url)
img = requests.get(url)
# 从url 里获取出fm 字段是图片后缀
suffix=url[url.index('fm=')+3:url.index('&crop')]
print(suffix)
file_name = 'E:/myself/imgs/'+time.strftime("%Y%m%d-%H%M%S", time.localtime()) + '.'+suffix
print('开始保存文件')
f = open(file_name, 'ab')
f.write(img.content)
print(file_name,'文件保存成功!')
f.close()
# 创建文件夹
def mkdir(self,path):
path = path.strip()
is_exists = os.path.exists(path)
if not is_exists:
print('创建名字叫做', path, '的文件夹')
os.makedirs(path)
print('创建成功!')
else:
print(path, '文件夹已经存在了,不再创建')
# 开始爬虫
def start_spider(self):
self.mkdir('E:/myself/imgs')
# 模拟发出请求
queryObj={
'query':'girl',
'page':1,
'per_page':20,
'xp':''
}
# 发出第一个请求解析到图片总页数
result=requests.get(self.weburl+'/napi/search/photos',params=queryObj)
search_result=json.loads(result.content)
total_pages=search_result['total_pages']
print('查询词',queryObj['query'],'页数为:',total_pages)
# 第一种方案 发出一个分页请求,页大小设为图片总数,页数第一页,一次性取回全部搜索结果,获取到json 进行解析(只能获取到30条。。。)
# 第2种方案 分页请求
for i in range(total_pages):
queryObj['page']=i+1
result=requests.get(self.weburl+'/napi/search/photos',params=queryObj)
# print(result.content)
# content=json.loads(result.content)
# print(content['total_pages'])
allPhoto=json.loads(result.content)
print('获取到第',i,'页,页大小:',len(allPhoto['results']))
for item in allPhoto['results']:
self.save_img(item['urls']['full'])
queryObj['per_page']=search_result['total']
result=requests.get(self.weburl+'/napi/search/photos',params=queryObj)
# 调用封装好的类
p=PicSpider('https://unsplash.com')
p.start_spider()
成果
直至截稿,程序仍在运行。
最后
代码的写法其实有很多种,以上只是一种实现写法,写得比较粗糙(是不是很像学生写的,手动滑稽),例如请求库,json 的解析 其实有很多第三方库可以选择,网上也有很多教程,我的肯定适合新手,这车很稳,农药准王者水平会带不动铂金吗。
吹嘘完了,总结:
缺点:
- 爬的有点慢,只有单线程,io 又慢,
- 数据也只是存在文件夹,所以后面打算放到mongodb 数据库
- 听说爬的太久,ip 会被封。
- 有些东西是加密的,爬回来也不一定看得懂
优点:
- 很多东西都能用python 脚本来爬了,可以获取到大量数据
- 可以用来装逼。。。(例如我现在这样)