我又来送福利啦!!!不同于上篇文章,这次我们的爬虫采用了多线程,一直以来被所谓的分布式  多线程  爬虫 给唬的怕怕的。今天就来一发多线程爬虫吧,还能看妹子图,想想就觉得很激动!!!

  依然是流程解释:

  1.分析要爬取的网址,发现页面分两级,第一级是多个图片集的入口,第二集是图片的入口。我们新建两个类,一个类是爬取所有图片集的url,一个类是根据得到的图片集的url爬取图片下载下来。第二个类的功能就跟我们上篇爬取煎蛋的功能一样。

  2.我们考虑用多线程去实现爬虫,为此我们引入了Queue模块,主线程爬取第一级得到多个图片集url放入到queue中,新建多个线程,从queue中取出数据,然后下载图片!

  3.遇到的困难呢  万恶的编码坑,要注意规避可能出现的错误 因为出现问题 线程就会死掉。

  这篇正则啥的就不搞了,其实都很简单的,对于html分析python有一些库是比较不错的,比如Beautiful Soup 有机会再学习学习!还有爬虫框架Scrapy。。。要学习的东西还非常非常多啊。务必脚踏实地!!!

 # -*- coding: utf-8 -*-
from __future__ import unicode_literals
from HttpClient import HttpClient
import sys,re,os
from threading import Thread
from Queue import Queue
from time import sleep q = Queue()#图片集url队列
imgCount = 0
class getRosiUrl(HttpClient):#一级url爬取类
def __init__(self):
self.__pageIndex = 1
self.__Url = "http://www.5442.com/tag/rosi/"
self.__refer = 'http://www.5442.com/tag/rosi.html'
  #将爬取的图片集url放入队列
def __getAllPicUrl(self,pageIndex):
realurl = self.__Url + str(pageIndex) + ".html"
print realurl
pageCode = self.Get(realurl,self.__refer)
type = sys.getfilesystemencoding()
#print pageCode[0:1666].decode("gb2312",'ignore').encode(type)
pattern = re.compile('<div.*?title">.*?<span><a href="(.*?)".*?</a>',re.S)
items = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type))
for item in items:
#print item
global q
q.put(item)
#print "放入队列"
  #得到最新页码
def __getNewPage(self):
pageCode = self.Get("http://www.5442.com/tag/rosi.html",self.__refer)
type = sys.getfilesystemencoding()
pattern = re.compile(r'<ul.*?<li .*?pageinfo">(.*?)</li>',re.S)
newPage = re.search(pattern,pageCode.decode("gb2312",'ignore').encode(type))
num = re.search("[0-9]+",newPage.group(1).decode("gb2312",'ignore').split("/")[0]).group()
if newPage != None:
return int(num)
return 0 def start(self):
page = self.__getNewPage()
for i in range(1,page):
self.__getAllPicUrl(i) #图片下载类
class downloadImg(HttpClient):
def __init__(self):
self.__pageIndex = 1
self.__floder = "rosi"
self.__Url = "http://www.5442.com/meinv/20150904/27058.html"
self.__refer = 'http://www.5442.com/tag/rosi.html'
def __getNewPage(self):
pageCode = self.Get(self.__Url,self.__refer)
type = sys.getfilesystemencoding()
pattern = re.compile(r'<ul.*?<li>.*?<a>(.*?)</a></li>',re.S)
newPage = re.search(pattern,pageCode.decode("gb2312",'ignore').encode(type))
if newPage !=None: num = re.search("[0-9]+",newPage.group(1).decode("gb2312",'ignore').split("/")[0]).group() return int(num)
return 0
  #得到图片集名称
def __getBookName(self):
pageCode = self.Get(self.__Url,self.__refer)
type = sys.getfilesystemencoding()
pattern = re.compile(r'<h1><a.*?>(.*?)</a>',re.S)
title = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type))
if title != None:
return title[0]
return "未命名"
  #得到每页图片url
def __getAllPicUrl(self,pageIndex):
realurl = self.__Url[:-5] + "_" + str(pageIndex) + ".html"
pageCode = self.Get(realurl)
type = sys.getfilesystemencoding()
pattern = re.compile('<p align="center" id="contents">.*?<a.*?<img src=(.*?) alt=.*?>',re.S)
items = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type))
self.__savePics(items,self.__floder)
  #下载保存图片
def __savePics(self,img_addr,folder):
for item in img_addr:
filename = self.__floder + "\\" +item.split('/')[-1][:-1]
print "正在保存图片:" + filename
print item[1:-1]
with open(filename,'wb') as file:
img = self.Get(item[1:-1])
file.write(img)
global imgCount
imgCount = imgCount + 1
def start(self):
while True:
global q
self.__Url = q.get()#从队列中取出一条图片集url
title = self.__getBookName()
self.__floder = os.getcwd() + "\\rosi\\" + title.decode("gb2312",'ignore')
isExists=os.path.exists(self.__floder)
if not isExists:
type = sys.getfilesystemencoding()
os.mkdir(self.__floder) page = self.__getNewPage() + 1
for i in range(self.__pageIndex,page):
self.__getAllPicUrl(i) q.task_done()#完成一项任务 if __name__ == '__main__':
isExists=os.path.exists("rosi")#创建保存目录
if not isExists:
os.mkdir("rosi")
for i in range(5):#新建5个线程 等待队列
print i
downImg = downloadImg()
t = Thread(target=downImg.start)
t.setDaemon(True)
t.start()
rosi = getRosiUrl()
rosi.start() q.join

  其中HttpClient.py就参考前面文章的吧,不过这个网站不需要代理了。。。下面看看成果吧,一波妹子图正在袭来:

自学Python十 爬虫实战三(美女福利续)的更多相关文章

  1. 自学Python九 爬虫实战二(美图福利)

    作为一个新世纪有思想有文化有道德时刻准备着的屌丝男青年,在现在这样一个社会中,心疼我大慢播抵制大百度的前提下,没事儿上上网逛逛YY看看斗鱼翻翻美女图片那是必不可少的,可是美图虽多翻页费劲!今天我们就搞 ...

  2. Python网络爬虫实战(三)照片定位与B站弹幕

    之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...

  3. Python爬虫实战三之实现山东大学无线网络掉线自动重连

    综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...

  4. python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...

  5. 关于Python网络爬虫实战笔记③

    Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...

  6. 关于Python网络爬虫实战笔记①

    python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...

  7. Python网络爬虫实战(一)快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  8. python网络爬虫实战之快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  9. Python简单爬虫入门三

    我们继续研究BeautifulSoup分类打印输出 Python简单爬虫入门一 Python简单爬虫入门二 前两部主要讲述我们如何用BeautifulSoup怎去抓取网页信息以及获取相应的图片标题等信 ...

随机推荐

  1. 哈夫曼树(Huffman Tree)

    Date:2019-06-21 14:42:04 做题时更多的是用到哈夫曼树的构造思想,即按照问题规模从小到大,依次解决问题,可以得到最优解 Description: 在一个果园里,多多已经将所有的果 ...

  2. kernel-常见参数或宏

    kernel-常见参数或宏 get_online_cpus get_online_cpus(); get_online_mems(); kstrdup_const 分配内存 cache_name = ...

  3. Hibernate连接池断开自动重连

    异常: javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException ...

  4. 【webpack结合React开发环境配置】React开发环境配置之Webpack结合Babel8.x版本安装的正确姿势(Webpack最新版4.x结合Babel8.x环境配置步骤)

    1. 安装cnpmnpm install -g cnpm --registry=https://registry.npm.taobao.org[使用淘宝镜像]2. 初始化package.json文件c ...

  5. DP背包问题小总结

    DP的背包问题可谓是最基础的DP了,分为01背包,完全背包,多重背包 01背包 装与不装是一个问题 01背包基本模型,背包的总体积为v,总共有n件物体,每件物品的体积为v[i],价值为w[i],每件物 ...

  6. TypeError与ValueError的区别

    typeerror:函数或方法接受了不适当的[类型]的参数,比如sum('nick'),sum函数不接受字符串类型:valueerror:函数或方法虽然接受了正确的[类型]的参数,但是该参数的[值]不 ...

  7. Centos下安装mysql(二进制版)

    1.下载安装包,选择相应的平台.版本,比如,选择64位Linux平台下的MySQL二进制包“Linux-Generic (glibc 2.5)(x86,64-bit),Compressed” 如:#w ...

  8. Django——13 Auth系统 登陆注册实例 权限的实现

    Django Auth系统中的表 注册登陆实例 权限的实现 登陆权限 操作权限 组操作  Auth系统中的表 从表的名称我们就能看出,auth_user,auth_group,auth_permiss ...

  9. 单词接龙(codevs 1018)

    2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 单词接龙是一个与我们经 ...

  10. Spring MVC-表单(Form)标签-文件上传(File Upload)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_upload.htm 说明:示例基于Spring MVC 4.1.6. 以下示例显 ...