1 技术栈

Python3.6 Python的版本

request 得到网页html、jpg等资源的lib

beautifulsoup 解析html的利器

html5lib 指定beautifulsoup按什么方式解析

os 创建文件夹需要用到系统操作lib

2 IDE

Anaconda Spider

3 如何正确的获取半次元网页内容

3.1 https请求的user head参数的设置

agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 OPR/46.0.2597.57'
user_head={
'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
'Accept-Encoding': "gzip, deflate, sdch, br",
'Accept-Language': "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2",
'Cache-Control':'max-age=0',
"Connection": "keep-alive",
'Referer': 'https://bcy.net/start',
'User-Agent': agent
}

Accept 网络处理的类型

Accept-Encoding 编码方式

Accept-Language 编码语言

Cache-Control 控制缓存的生命周期

Connection 连接方式,选择keep-alive长期连接

Referer 从哪个页面发来的请求

User-Agent 浏览器标志,防止半次元服务器识别http请求为浏览器发起

3.2 cookie文件的读取

cookie_file = "bcy_cookie.txt"
if os.path.exists(cookie_file):
#如果cookies文件存在则直接读取cookie
bcy_cookies = {}
with open(cookie_file,'r',buffering = 4*1024) as fp:
for line in fp.read().split(';'):
name,value = line.strip().split('=',1)
bcy_cookies[name] = value
fp.flush()
print('load cookies is Success')
else:
print('you have no cookie')
print ("bcy cookies:" + str(bcy_cookies))

bcy_cookie是一个对象

bcy_cookie.txt中的内容为:

acw_tc=AQAAACHqkjHLZQcAtVPt3f8ifalDKgni;
PHPSESSID=vgeda76lj7339cov0n76390rl0;
lang_set=zh;
mobile_set=no

3.3 request 读取html内容并转为soup对象

   GALLERY_START_URL = 'https://bcy.net/coser/toppost100'
#浏览器打开首页
gallery_content = requests.get(GALLERY_START_URL,cookies=bcy_cookies,headers=user_head,timeout=9).text.encode('utf-8')
#得到首页的soup的对象
gallery_soup = BeautifulSoup(gallery_content,'html5lib')

requests.get 获取一个html对象,timeout是设置允许的最大时间延迟

BeautifulSoup 将html对象转为可以被解析的soup对象,采用html5lib解析

3.4 soup对象查找源代码中的连接



注意应该查找source(源代码)中作品连接入口,

elements是经过浏览器chrome加载js渲染后的dom,所以对应的css class可能不一样

	# 得到所有的作品入口
all_work = gallery_soup.findAll('li',class_ = 'l-work-thumbnail')

3.5 遍历每一个all_work对象获取标题和作品进入的连接

	# 得到所有的作品入口
for work in all_work:
work_a = work.find('div',class_ = 'work-thumbnail__topBd').find('a')
title = work_a['title']
#去掉保存到本地图片文件名中非法字符
unvalid_str = '<>,\/|,:,"",*,?'
for ch in unvalid_str:
title = title.replace(ch,'')
title = title.strip()
work_url = 'https://bcy.net' + work_a['href']

因为Windows系统不允许文件夹出现<>,\/|,:,"",*,?等字符,所以需要做delete处理

3.6 新建作品文件夹

专门写一个函数用于作品文件夹创建,并做是否创建的处理

# @创建gallery文件夹
# @input:GALLERY_NAME gallery保存的文件夹
# @output:
def mkdir(GALLERY_NAME):
GALLERY_NAME = GALLERY_NAME.strip()
GALLERY_NAME = GALLERY_NAME.rstrip("\\") if not os.path.exists(GALLERY_NAME): # 如果不存在则创建目录
print(GALLERY_NAME + ' Success') # 创建目录操作函数
os.makedirs(GALLERY_NAME)
return True
else: # 如果目录存在则不创建,并提示目录已存在
print(GALLERY_NAME + ' existence')
return False

主函数中的步骤

	#新建作品
WORK_FOLD_NAME = GALLERY_NAME + '\\' +str(top_index).zfill(3) + '_' + title
mkdir(WORK_FOLD_NAME)

3.7 点击进入作品连接,遍历读取所有的图片

	#得到作品html对象
image_content = requests.get(work_url,cookies=bcy_cookies,headers=user_head,timeout=20).text.encode('utf-8') #得到作品soup对象
image_group_soup = BeautifulSoup(image_content,'html5lib') #每一个图片的soup对象
image_group_div = image_group_soup.findAll('img',class_ = 'detail_std') #记录爬去图片的标号
image_index = 0 #遍历每一个有图片的image div
for image in image_group_div:
image_url = image['src'] #图片的URL
image_url = image_url[:-5] #图片URL去掉后缀得到真正的RAW图片 #获取图片图像,注意图片是资源所用 stream设置为True
pic = requests.get(image_url, stream=True,cookies=bcy_cookies, headers=user_head,timeout=12) #图片保存在本地的路径
file_local_url = WORK_FOLD_NAME + '\\' +str(image_index).zfill(2) +'.jpg' #图片已存在则直接continue
if os.path.exists(file_local_url):
print('pic has been downloaded!')
continue
else:
print('pic is downloaded, start to writing to local ')
# 推荐使用witho open,避免忘记进行fp.close()操作,buffering设置是为了IO加速
with open(file_local_url, 'wb',buffering = 4*1024) as fp:
fp.write(pic.content) #写入file_local_url内容到图片
fp.flush()
print(image_url +' download Successful') image_index = image_index +1

上面的buffering参数值得一说,如果不加则直接从pic读取持续写入磁盘中

如果图片很大,这种行为很伤磁盘

所以需要设置一个缓冲区,每从网络读取4K大小才从内存写入磁盘

完整代码,见我的Github

https://github.com/Kalafinaian/BcyTopSpider

如果你喜欢这个Python小程序,欢迎各位Start我这个repository

Author by : Kalafianian
本当は空を飞べると知っていたから
羽ばたくときが怖くて风を忘れた
Oblivious 何処へ行くの

[原创] Python3.6+request+beautiful 半次元Top100 爬虫实战,将小姐姐的cos美图获得的更多相关文章

  1. 爬虫小探-Python3 urllib.request获取页面数据

    使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...

  2. 【转】python3 urllib.request 网络请求操作

    python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...

  3. Python3 urllib.request库的基本使用

    Python3 urllib.request库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urlli ...

  4. Python爬虫入门教程 12-100 半次元COS图爬取

    半次元COS图爬取-写在前面 今天在浏览网站的时候,忽然一个莫名的链接指引着我跳转到了半次元网站 https://bcy.net/ 打开之后,发现也没有什么有意思的内容,职业的敏感让我瞬间联想到了 c ...

  5. python3 urllib.request 网络请求操作

    python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...

  6. Python爬虫入门教程: 半次元COS图爬取

    半次元COS图爬取-写在前面 今天在浏览网站的时候,忽然一个莫名的链接指引着我跳转到了半次元网站 https://bcy.net/ 打开之后,发现也没有什么有意思的内容,职业的敏感让我瞬间联想到了 c ...

  7. 自己动手,丰衣足食!Python3网络爬虫实战案例

    本教程是崔大大的爬虫实战教程的笔记:网易云课堂 Python3+Pip环境配置 Windows下安装Python: http://www.cnblogs.com/0bug/p/8228378.html ...

  8. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  9. 使用Beautiful Soup编写一个爬虫 系列随笔汇总

    这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...

随机推荐

  1. 【Android Developers Training】 19. 序言:通过Fragments构建动态UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 62. 搭建一个OpenGL ES环境

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 『转』MarsEdit快速插入源代码

    开始用MarsEdit来写博文,客户端的,毕竟是要方便的多啊. 遇到的第一个问题就是:MarsEdit没有提供快速插入源代码的工具,而对于我这枚码农而言,这个就有点太杯具了. 简单研究了一下,发现Ma ...

  4. JS实现全选、不选、反选

    思路:1.获取元素.2.用for循环历遍数组,把checkbox的checked设置为true即实现全选,把checkbox的checked设置为false即实现不选.3.通过if判断,如果check ...

  5. Java jvm级别native关键词、JNI详解

    1.native关键词的引入 再完美的编程语言也有自己的不足之处,当然Java也不例外,Java的不足之处除了体现在运行速度(这点往往被一些其他编程语言使用者所诟病)上要比传统的C++慢许多之外,Ja ...

  6. unslider插件的使用

    深入理解unslider.js源码 最近用到了一个挺好用的幻灯片插件,叫做unslider.js,就想看看怎么实现幻灯片功能,就看看源码,顺便自己也学习学习.看完之后收获很多,这里和大家分享一下. u ...

  7. 服务器 设置 将 Tomcat 注册 到系统服务 及使用方法

    将TOMCAT注册成系统服务的好处,就是方便维护,在服务器重启的时候,系统会自动启动系统服务,而不必手动操作,这就为我们在项目维护时省下不少麻烦. 在项目维护期间有很多客户只要一有问题,就电话招呼,而 ...

  8. HDU 1864 最大报销额(DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others) ...

  9. java 关键字final

    一.最终的意思,可以修饰类,方法,变量.特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量.二.面试相关: 1.局部变量基本类型 值不能发生改变 例如: ...

  10. Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析

    QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:https://github.com/20100507/Qzone [没有加入多线程,希望你可以参与进 ...