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

  依然是流程解释:

  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. 4.Linux的进程

    4.1 Linux的进程 4.1.1 进程的概述 有关进程的一些基本概念: 1.什么是进程: 当程序被触发后,执行者的权限与属性.程序的程序代码与所需的数据都会被加载到内存中,操作系统并给予这个内存内 ...

  2. enote笔记语言(4)

    what:我想知道某个“关键词(keyword)”(即,词语,可以是概念|专业术语|.......)的定义. why:我想知道事物发生的原因:我会不会犯“归因错误”?是“单因素”的还是“多因素”的原因 ...

  3. 30.IK中文分词器的安装和简单使用

    在之前我们学的都是英文,用的也是英文的standard分词器.从这一节开始,学习中文分词器.中国人基本上都是中文应用,很少是英文的,而standard分词器是没有办法对中文进行合理分词的,只是将每个中 ...

  4. Problem 42

    Problem 42 https://projecteuler.net/problem=42 The nth term of the sequence of triangle numbers is g ...

  5. 远程连接Ubuntu的桌面

    参考:http://www.linuxidc.com/Linux/2016-06/132442.htm http://teliute.org/linux/TeUbt/lesson52/lesson52 ...

  6. 【Codeforces 1114C】Trailing Loves (or L'oeufs?)

    [链接] 我是链接,点我呀:) [题意] 问你n!的b进制下末尾的0的个数 [题解] 证明:https://blog.csdn.net/qq_40679299/article/details/8116 ...

  7. Divisible Group Sums

    Divisible Group Sums Given a list of N numbers you will be allowed to choose any M of them. So you c ...

  8. iOS学习笔记18-CoreData你懂的

    一.CoreData介绍 CoreData是iOS5之后新出来的的一个框架, 是对SQLite进行一层封装升级后的一种数据持久化方式. 它提供了对象<-->关系映射的功能,即能够将OC对象 ...

  9. 小记——GTMD校园网

    前言 学校一年前开通了校园网,然鹅信号未覆盖我们住的公寓,又多忍受了一年的小破宽带(10M带宽,100块300个小时) 上个星期,架设了一年的校园网终于通了,然后我们发现——校园网69元一个月,一个用 ...

  10. 解决Ubuntu下Apache不解析PHP问题

    这两天笔者遇到了一个很操蛋的问题——Apache无法解析PHP代码了,之前一直用的挺好的,突然就挂了,然后在网上疯狂的找解决办法,但是大都是php5的版本,而我却是7的版本,我就先顺便把5版本的解决方 ...