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文件存在则直接读取cookiebcy_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] = valuefp.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 Trueelse:  # 如果目录存在则不创建,并提示目录已存在print(GALLERY_NAME + ' existence')return False

主函数中的步骤

    #新建作品WORK_FOLD_NAME = GALLERY_NAME + '\\' +str(top_index).zfill(3) + '_' + titlemkdir(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 divfor image in image_group_div:image_url = image['src'] #图片的URLimage_url = image_url[:-5] #图片URL去掉后缀得到真正的RAW图片#获取图片图像,注意图片是资源所用 stream设置为Truepic = 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'#图片已存在则直接continueif os.path.exists(file_local_url):print('pic has been downloaded!')continueelse: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 何処へ行くの

转载于:https://www.cnblogs.com/Kalafinaian/p/7354063.html

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

  1. 半次元cos图片爬虫

    这是我第一次写博客,有不足的地方请见谅 先放码 import requests import re import osdef Requests(url,head):while True:try:res ...

  2. 记半次元App数据解密记录

    最近发现一个有意思的应用,半次元,这个应用中有很多Cosplay美图,很感兴趣便想试试能否通过抓包分析获取相应的接口,没想到自己实际上已经跳到了一个大大的深坑之中,一起来看下吧. 万里长征第一步:抓包 ...

  3. Python爬取半次元图片[一]

    用到模块有requests,BeautifulSoup4,lxml(BeautifulSoup基于这个解析,据说速度会快很多),re(正则ps.只用到了一个compile函数) 介绍下思路: 创建Im ...

  4. python 异步协程爬虫-半次元图片

    python 异步协程爬虫-半次元图片 1. 页面分析 2.代码大体构思 3.源码分析 3.1 完成效果 4.异步协程的优势 5.难点分析 6.可扩展性 欢迎私信或评论区交流 爬取网址 : https ...

  5. 半次元获取收藏夹下所有的图片

    第一次写文章,写的内容有点少,请见谅哈. 一个链接,就可以下载收藏夹的所有图片了,也就是"我的喜欢"的所有图片. 半次元的coser们都是那么好看,每次都会忍不住去点赞收藏,时不时 ...

  6. python爬取图片源码_半次元图片爬取-python爬取半次元图片源码下载-西西软件下载...

    python爬取半次元图片源码,由大神自制的python爬取工具,本源码针对半次元图片平台,可以爬取最新的网站图片资源,支持自定义保存目录,非常方便,需要requests库的支持,想要相关源码资源的朋 ...

  7. java ajax cookie_项目 | Java获取Ajax页面(半次元)—— PhantomJS实现(带cookie登录)...

    写在前面 之前,为了从半次元上下载coser小姐姐的照片,想写个爬虫保存网页上的图片链接,就直接用了Jsoup来读取半次元的网页. 这里说一下,对于想写Java爬虫的小伙伴们来说,Jsoup算是很好用 ...

  8. phantomjs java 爬虫_项目 | Java+PhantomJs爬虫实战——半次元 下载高清原图

    写在前面 前段时间实习结束回来休息,某日闲逛无意间又打开了半次元,突然看见几个好漂亮的coser小姐姐,就想存个图片当壁纸(づ ̄3 ̄)づ╭❤- 然而又发现,很多小姐姐都设置了作品禁止保存或者是右下角带 ...

  9. Python3 爬虫实战 — 安居客武汉二手房【requests、Beautiful Soup、CSV】

    爬取时间:2019-10-09 爬取难度:★★☆☆☆☆ 请求链接:https://wuhan.anjuke.com/sale/ 爬取目标:爬取武汉二手房每一条售房信息,包含地理位置.价格.面积等,保存 ...

  10. Python3 爬虫实战 — 猫眼电影TOP100【requests、lxml、Xpath、CSV 】

    爬取时间:2019-09-23 爬取难度:★☆☆☆☆☆ 请求链接:https://maoyan.com/board/4 爬取目标:猫眼电影 TOP100 的电影名称.排名.主演.上映时间.评分.封面图 ...

最新文章

  1. C#字典Dictionary排序(顺序、倒序)
  2. crash工具解析_IDA反汇编静态调试Android平台C++的so文件Crash入门
  3. 【CLRS】《算法导论》读书笔记(一):堆排序(Heapsort)
  4. LINUX下的tty,console与串口分析
  5. uiwebview 编辑html5,【iOS】UIWebView HTML5 扩展
  6. 2020年上半年家电市场报告
  7. MySQL5.7的搭建以及SSL证书
  8. Memcached 一致性哈希算法PHP实现
  9. hashmap containsvalue时间复杂度_Java-HashMap面试问答
  10. redis订阅怎么退出_redis订阅关闭异常解决
  11. 20145209 《信息安全系统设计基础》第10周学习总结
  12. 【iOS】Touch Up Inside 和 Touch Up Outside 的区别
  13. python怎么通过手机号定位_基于Python的免费手机号码归属地查询
  14. 需求分析模板_可以从哪些方面进行财务分析?财务分析模板实例拿去套用吧
  15. 通过js获取本机的IP地址
  16. 如何利用网管软件管控网络设备
  17. ecshop内页显示最新文章
  18. 找对英语学习方法的第一本书 PDF 带完整的目录
  19. 解决Strokeit在win8下的图标问题和开机启动问题
  20. 【esxi跑网心云(cdn)软路由拨号】esxi服务器使用ikuai虚拟机拨号并配置家庭路由器上网

热门文章

  1. 35种神奇的心理效应
  2. 外卖点餐管理系统源码
  3. ESP8266烧录选项中的QIO 和 DIO解释
  4. select 显示”请选择“,怎样在选择之后消失的问题
  5. 安全牛我们今天的网络安全问题源自1648年,其实我觉得其实早在资治通鉴上的中国法家们已经表示同样想法
  6. 软件测试多长时间可以学习,软件测试学习多长时间啊?好学吗?
  7. java文章采集爬虫代码示例
  8. 黑苹果(Hackintosh)简单步骤教程
  9. PHP微信app接口退款,PHP接入微信退款接口
  10. 2019年最新手游脚本开发教程