自学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怎去抓取网页信息以及获取相应的图片标题等信 ...
随机推荐
- (C/C++学习)13.C语言字符串处理函数(一)
说明:字符串处理的函数很多,本文将例举经常遇到的一些函数加以说明. 一.字符串的输入输出 头文件:<stdio.h> 1.利用标准输出函数 printf() 来输出,将格式设置为 s% . ...
- C语言指针与指向指针的指针
#include <stdio.h> #include <string.h> int main() { char a[]="hello world"; ch ...
- 64.root object的理解
一.root object的理解 就是某个type对应的mapping json,包括properties,metadata(_id,_source,_type),settings(analy ...
- odoo 权限杂记
最近做一个任务督办模块,涉及到一些权限问题,折磨了几天,终于是解决了. 任务表中关联了hr_employee,分别有默认字段创建人,Many2one的发布人.监督人和Many2many类型的主责人,这 ...
- BZOJ 1230 Usaco2008 Nov 开关灯
[题意概述] 给出一个01序列,初始时序列全为0,每次有修改操作或询问操作,修改操作要求把L~R区间中的0变成1,1变成0,查询操作要求输出L~R区间的1的个数 [题解] 线段树. 每次区间修改把区间 ...
- BUPT2017 springtraining(16) #1 ——近期codeforces简单题目回顾
这里是contest 8道题全部来源于 cf 的两场contest (出题人可真懒啊 Codeforces Round #411 (Div. 2)的ABCDE Codeforces Round #40 ...
- 用循环链表实现Josephus问题
Josephus问题:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列.如此反复直到所有的人全部出列为止. 思路:构建一个没有 ...
- hdu_1039_Easier Done Than Said_201311051511
Easier Done Than Said? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- O - String Problem KMP 字符串最小表示法
Give you a string with length N, you can generate N strings by left shifts. For example let consider ...
- 35岁,成就寥寥,为时已晚?(I am 35 and I haven't achieved much in life. Is it too late?)
今天无意中看到Quora上的一个问题: I am 35 and I haven't achieved much in life. Is it too late? 下面的一个排第二的回复我蛮喜欢的,直接 ...