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

  依然是流程解释:

  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. 【Android】登陆界面设计

    界面布局 布局其实很简单,用相对布局累起来就可以了,然后注册和记住密码这两个控件放在一个水平线性布局里 界面底部还设置了一个QQ一键登录的入口,可以直接用. 控件的ID命名有点乱 <?xml v ...

  2. Ubuntu网卡设置:配置/etc/netplan

    对于Ubuntu1804版本,经过测试如下配置可以设置静态IP地址: Google@ubuntu:~$ cat /etc/netplan/01-netcfg.yaml network: etherne ...

  3. Python 元组和列表

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...

  4. 小白两篇博客熟练操作MySQL 之 第一篇

    小白两篇博客熟悉操作MySQL  之   第一篇 一.概述 1. 什么是数据库? 答: 储存数据的仓库, 如: 在ATM的事例中创建的一个db 目录, 称为数据库 2. 什么是Mysql, Oracl ...

  5. BZOJ 2501 [usaco2010 Oct]Soda Machine

    [题意概述] 给出一个[0,1,000,000,000]的整数数轴,刚开始每个位置都为0,有n个区间加操作,最后询问数轴上最大的数是多少. [题解] 我写的是离散化后线段树维护区间最值. 其实貌似不用 ...

  6. hdu 1220组合数学

    两个立方体相交的点数有0 1 2 4 不考虑相交点数的话有C(n,2)个立方对. 而求不超过两个交点的对数,即为用总的减去有四个交点的对数,而四个交点即为同面 四个交点的对数为相同的面的个数为(所有的 ...

  7. [luogu1373]小a和uim之大逃离_动态规划

    小a和uim之大逃离 题目大意:有一个n*m的矩阵.每个格子上有一坨0~k不等量的权值.有两个人,每个人任选一个格子作为出发点,并只能向下或向右走.求最后两个人所得到的权值mod k相等的方案数. 注 ...

  8. [poj3070]Fibonacci_矩乘_快速幂

    Fibonacci poj-3070 题目大意:求Fibonacci第n项. 注释:模数为10000,$1\le n \le 10^9$. 想法:矩阵题,用例题6的想法,我们构造矩阵 $\begin{ ...

  9. JDBC数据源(DataSource)数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。

    JDBC数据源(DataSource)的简单实现   数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用. 2.数据源提供了一种简单获取数据库连接的方式,并能在内部通 ...

  10. Go语言基础介绍

    Go是一个开源的编程语言.Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言.目前,Go最新发布版本为1.10. Go语言可以运行在Linux.FreeBSD ...