自学Python十 爬虫实战三(美女福利续)
我又来送福利啦!!!不同于上篇文章,这次我们的爬虫采用了多线程,一直以来被所谓的分布式 多线程 爬虫 给唬的怕怕的。今天就来一发多线程爬虫吧,还能看妹子图,想想就觉得很激动!!!
依然是流程解释:
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十 爬虫实战三(美女福利续)的更多相关文章
- 自学Python九 爬虫实战二(美图福利)
作为一个新世纪有思想有文化有道德时刻准备着的屌丝男青年,在现在这样一个社会中,心疼我大慢播抵制大百度的前提下,没事儿上上网逛逛YY看看斗鱼翻翻美女图片那是必不可少的,可是美图虽多翻页费劲!今天我们就搞 ...
- Python网络爬虫实战(三)照片定位与B站弹幕
之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...
- Python爬虫实战三之实现山东大学无线网络掉线自动重连
综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...
- python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...
- 关于Python网络爬虫实战笔记③
Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...
- 关于Python网络爬虫实战笔记①
python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...
- Python网络爬虫实战(一)快速入门
本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...
- python网络爬虫实战之快速入门
本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...
- Python简单爬虫入门三
我们继续研究BeautifulSoup分类打印输出 Python简单爬虫入门一 Python简单爬虫入门二 前两部主要讲述我们如何用BeautifulSoup怎去抓取网页信息以及获取相应的图片标题等信 ...
随机推荐
- 转:LINQ教程一:LINQ简介
原文地址:https://www.cnblogs.com/dotnet261010/p/8278793.html 一.为什么要使用LINQ 要理解为什么使用LINQ,先来看下面一个例子.假设有一个整数 ...
- 开发LED屏幕页面遇到的问题
上上个礼拜公司的展销会活动需要一个展示在LED大屏幕的页面,顶部显示平台交易总金额,左右两边分别是厂家和买家实时交易记录,具体页面长下面这个样子 需求评审的时候产品说顶部的总金额要有一个数字滚动或者翻 ...
- 洛谷——P1063 能量项链
P1063 能量项链 题目描述 在MarsMars星球上,每个MarsMars人都随身佩带着一串能量项链.在项链上有NN颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对 ...
- Django 初学
一.什么是web框架 框架,即framework ['fremwɝk],特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞 ...
- C++数组查重
今天课上实验课,遇到一道题目,需要查找一个数组中出现次数最多的元素和次数,并且输出.第一次用struct模拟字典,十分麻烦而且复杂度是O(n*n).其实,运用转化的思想,可以先将其排序,然后再查找即可 ...
- java 同时安装多版本问题
java 同时安装多版本问题(转) http://www.cnblogs.com/SamuelSun/p/6022296.html http://blog.csdn.net/u013256622/ar ...
- nyoj_37_回文字符串_201403121649
回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当 ...
- POJ 1416 Shredding Company 回溯搜索 DFS
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6173 Accepted: 3361 ...
- shell EOF注意点
当sqlplus与shell交互的时候我们这么用 su - oracle -c "sqlplus / as sysdba<<EOF select * from gv($insta ...
- javascript正則表達式
定义一个正則表達式 能够用字面量 var regex = /xyz/; var regex = /xyz/i; 也能够用构造函数 var regex = new RegExp('xyz'); var ...