使用python编写一个壁纸网站的简单爬虫
目标网站:http://www.netbian.com/
目的:实现对壁纸各分类的第一页壁纸的获取
一:分析网站,编写代码:
(ps:源代码在文章的最后)
1.获取网站目录部分的一大段代码,下一步再进行仔细匹配网址与标题.
#coding=gbk
#目标:下载各目录的壁纸(大图)
__author__ = 'CQC'
import urllib2
import urllib
import re
import os #创建壁纸下载文件夹
path = 'd:\\彼岸壁纸'
if not os.path.isdir(path):
os.makedirs(path)
#目录
big_title = [] #首页打开
url = 'http://www.netbian.com/'
headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0'}
request = urllib2.Request(url,headers = headers)
response = urllib2.urlopen(request) #首页目录源代码获取
pat_menu = re.compile('<ul class="menu">(.*?)</a></div>',re.S)
code_menu = re.search(pat_menu,response.read())
如图:
2.进行分类的标题与链接的匹配。
#目录标题
pat_menu_title = re.compile('<a href=".*?" title="(.*?)">',re.S)
menu_title = re.findall(pat_menu_title,code_menu.group(1))
for a_item in menu_title:
big_title.append(a_item)
print a_item #目录链接
pat_menu_link = re.compile('<a href="(.*?)" title=".*?">',re.S)
menu_link = re.findall(pat_menu_link,code_menu.group(1))
如下图所示:
3.从爬取到的目录进入,获得该目录下所有壁纸的标题与链接.
#进入目录
j = 0
for b_item in menu_link:
url_menu = 'http://www.netbian.com/' + b_item
request_son = urllib2.Request(url_menu,headers = headers)
response_son = urllib2.urlopen(request_son)
#获得每个目录的图片标题,链接 #获得子目录标题
title_son = []
pat_title_son = re.compile('<img src=".*?" data-src=".*?" alt="(.*?)"/>',re.S)
res_title = re.findall(pat_title_son,response_son.read())
for c_item in res_title:
title_son.append(c_item) #筛选出子目录代码
pat_code_son = re.compile('<ul>(.*?)</ul>',re.S)
middle_pattern = urllib2.Request(url_menu,headers = headers)
middle_response = urllib2.urlopen(middle_pattern)
res_code_son = re.search(pat_code_son,middle_response.read()) #获得子目录链接,合成大图网页链接
pat_link_son = re.compile('<li><a href="(.*?)" target="_blank"><img',re.S)
res_link = re.findall(pat_link_son,res_code_son.group(1))
如下图所示:
4.根据上一步爬取到的链接,合成真正的1080p壁纸链接.
因为我们从上图标题点进去后是这样:
还需要点击下载按钮才能打开1080p壁纸的链接。为了方便,我们直接合成1080p壁纸的链接.
例如: http://www.netbian.com/desk/9805.htm
对应的1080p网址:http://www.netbian.com/desk/9805-1920x1080.htm
代码:
i = 0
#显示进度
print big_title[j]
for d_item in res_link:
#获得大图下载链接
if d_item == 'http://www.mmmwu.com/':
pass
else:
new_link = 'http://www.netbian.com/' + d_item[:-4] + '-1920x1080.htm'
print new_link
(ps:由于‘美女’分类中的第一个标题链接到了其他网站,为了简单一点,所以我直接跳过了)
5.进入1080p壁纸链接,下载壁纸.
request_real = urllib2.Request(new_link,headers = headers)
response_real = urllib2.urlopen(request_real)
pat_real = re.compile('<img src="(.*?)" alt=".*?"/></td></tr>') link_real = re.search(pat_real,response_real.read())
#跳过vip壁纸
if link_real:
fina_link = link_real.group(1)
#创建下载目录
path_final = 'd:\\彼岸壁纸\\' + big_title[j] + '\\'
if not os.path.isdir(path_final):
os.makedirs(path_final)
path_pic = path_final + title_son[i] + '.jpg'
f = open(path_pic,'wb')
data = urllib.urlopen(fina_link)
f.write(data.read())
f.close()
if not data:
print "Download Failed."
i += 1
print 'One menu download OK.'
j += 1
6.下载完成.
二、所有的源代码。
#coding=gbk
#目标:下载各目录的壁纸(大图)
__author__ = 'CQC'
import urllib2
import urllib
import re
import os #创建壁纸下载文件夹
path = 'd:\\彼岸壁纸'
if not os.path.isdir(path):
os.makedirs(path)
#目录
big_title = [] #首页打开
url = 'http://www.netbian.com/'
headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0'}
request = urllib2.Request(url,headers = headers)
response = urllib2.urlopen(request) #首页目录源代码获取
pat_menu = re.compile('<ul class="menu">(.*?)</a></div>',re.S)
code_menu = re.search(pat_menu,response.read()) #目录标题
pat_menu_title = re.compile('<a href=".*?" title="(.*?)">',re.S)
menu_title = re.findall(pat_menu_title,code_menu.group(1))
for a_item in menu_title:
big_title.append(a_item)
print a_item #目录链接
pat_menu_link = re.compile('<a href="(.*?)" title=".*?">',re.S)
menu_link = re.findall(pat_menu_link,code_menu.group(1)) #进入目录
j = 0
for b_item in menu_link:
url_menu = 'http://www.netbian.com/' + b_item
request_son = urllib2.Request(url_menu,headers = headers)
response_son = urllib2.urlopen(request_son)
#获得每个目录的图片标题,链接 #获得子目录标题
title_son = []
pat_title_son = re.compile('<img src=".*?" data-src=".*?" alt="(.*?)"/>',re.S)
res_title = re.findall(pat_title_son,response_son.read())
for c_item in res_title:
title_son.append(c_item) #筛选出子目录代码
pat_code_son = re.compile('<ul>(.*?)</ul>',re.S)
middle_pattern = urllib2.Request(url_menu,headers = headers)
middle_response = urllib2.urlopen(middle_pattern)
res_code_son = re.search(pat_code_son,middle_response.read()) #获得子目录链接,合成大图网页链接
pat_link_son = re.compile('<li><a href="(.*?)" target="_blank"><img',re.S)
res_link = re.findall(pat_link_son,res_code_son.group(1))
i = 0
#显示进度
print big_title[j]
for d_item in res_link:
#获得大图下载链接
if d_item == 'http://www.mmmwu.com/':
pass
else:
new_link = 'http://www.netbian.com/' + d_item[:-4] + '-1920x1080.htm'
print new_link
request_real = urllib2.Request(new_link,headers = headers)
response_real = urllib2.urlopen(request_real)
pat_real = re.compile('<img src="(.*?)" alt=".*?"/></td></tr>') link_real = re.search(pat_real,response_real.read())
#跳过vip壁纸
if link_real:
fina_link = link_real.group(1)
#创建下载目录
path_final = 'd:\\彼岸壁纸\\' + big_title[j] + '\\'
if not os.path.isdir(path_final):
os.makedirs(path_final)
path_pic = path_final + title_son[i] + '.jpg'
f = open(path_pic,'wb')
data = urllib.urlopen(fina_link)
f.write(data.read())
f.close()
if not data:
print "Download Failed."
i += 1
print 'One menu download OK.'
j += 1
使用python编写一个壁纸网站的简单爬虫的更多相关文章
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 使用 python 编写一个授权登录验证的模块
使用 python 编写一个授权登录验证的模块 我们编写的思路: 1.登录的逻辑:如果用户名和密码正确,就返回 token . 2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时 ...
- 为Python编写一个简单的C语言扩展模块
最近在看pytorh方面的东西,不得不承认现在这个东西比较火,有些小好奇,下载了代码发现其中计算部分基本都是C++写的,这真是要我对这个所谓Python语音编写的框架或者说是库感觉到一丢丢的小失落,细 ...
- [初学Python]编写一个最简单判断SQL注入的检测工具
0x01 背景 15年那会,几乎可以说是渗透最火的一年,各种教程各种文章,本人也是有幸在那几年学到了一些皮毛,中间因学业问题将其荒废至今.当初最早学的便是,and 1=1 和 and 1=2 这最简单 ...
- 如何用Python编写一个聊天室
一.课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx. ...
- 使用python编写量子线路打印的简单项目,并使用Sphinx自动化生成API文档
技术背景 该文章一方面从量子线路的打印着手,介绍了一个简单的python量子线路工程.同时基于这个简单的小工程,我们顺带的介绍了python的API文档自动化生成工具Sphinx的基本使用方法. 量子 ...
- day-1 用python编写一个简易的FTP服务器
从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...
- Python 编写一个有道翻译的 workflow 教程
最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...
- Python入门-编写抓取网站图片的爬虫-正则表达式
//生命太短 我用Python! //Python真是让一直用c++的村里孩子长知识了! 这个仅仅是一个测试,成功抓取了某网站1000多张图片. 下一步要做一个大新闻 大工程 #config = ut ...
随机推荐
- MVC5 Entity Framework学习之Entity Framework高级功能(转)
在之前的文章中,你已经学习了如何实现每个层次结构一个表继承.本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时可以利用的高级功能. 在本节中 ...
- python 学习2
在1的基础上 settings.py blog/models.py: 打开一个cmd, net start mysql ,启动mysql服务 mysql -uroot -p 再在py_fir目录下打开 ...
- javascript无线端的判断
经常在工作中要求网页做这样的处理判断:针对无线端的网页,我们需要兼容一种异于PC端的网页效果. 如下代码就可以实现无线端的判断: var mobs = ['android', 'ipad', 'ipo ...
- curl --connect-timeout 判断国内外网络windows 批处理
1.下载编译curl curl 下载地址:http://curl.haxx.se/download.html ,下载后解压到一个目录,使用vs开发者工具里的 “Visual Studio 命令提示(2 ...
- N 皇后问题
#include <set> #include <iostream> #include <string> #include <vector> #incl ...
- 数据加密标准——DES
DES算法和DESede算法统称DES系列算法.DES算法是对称加密算法领域中的典型算法,为后续对称加密算法的发展奠定了坚实的基础.但是DES算法密钥偏短,仅有56位,迭代次数偏少,受到诸如查分密码分 ...
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...
- IOS Core Animation Advanced Techniques的学习笔记(四)
第五章:Transforms Affine Transforms CGAffineTransform是二维的 Creating a CGAffineTransform 主要有三种变 ...
- CentOS 7 64位的安装流程
若出现以下不支持虚拟机的问题: 表示虚拟机检测到CPU支不支持虚拟化,要去BIOS里设置虚拟化技术设置为enabled:重启电脑-按"F1或Fn+F1"-进入BIOS主界面-移至S ...
- 使用wex5得到的一些教训
博主一直都是做web开发,前段时间有个小想法,想给自己做个android小应用(很小,功能特别简单). 了解到可以用js直接做,貌似很简单,选用了wex5(基于codova插件)来直接开发. 最终发现 ...