需求:最近对python爬虫感兴趣,于是学习了下python爬虫并找了个网站练习,练习网址:http://www.mmjpg.com,其中每一套图都是一张一个页面,存一套图如果是手动得点翻几十个页面,但如果使用爬虫的话,就很方便了,轻轻松松就可以把美女存到硬盘了。
实验环境:
- Windows 10,Python 2.7.6,Pycharm
1.确定目标网址
www.mmjpg.com2.分析网页URL变化
通过打开不同页数的页面内容后发现
第二页:http://www.mmjpg.com/home/2
第三页:http://www.mmjpg.com/home/3
每当我们点击一个页面,url改变的是最后面的数字,因此我们需要找到总页数的html代码,才能对其进行爬虫翻页
3.分析网页源代码
通过审查网页元素定位到了总页数的html元素:<a href="/home/79" class="last">最旧</a> 由此可以得出该网址的总页数为79页,接下来便可对其进行提取
4.引入所需要的库
import os
import re
import urllib2
from lxml import html
5.获取网页源代码
def get_source_page(self, url):
'''
返回经过lxml.html.fromstring 模块处理的<Element html at 0x36e8278>
可以用 XPath 来过滤数据
'''
try:
response = urllib2.urlopen(url, timeout=3).read()
selector = html.fromstring(response)
except:
selector = None
finally:
return selector
6.获取总页数
def get_sum_page(self, url):
selector = self.get_source_page(url)
'''使用xpath提取网页中总页数的元素'''
sum_page = selector.xpath('//div[@class="page"]//a[last()]/@href')[0].split('/')[-1]
return sum_page
7.用总页数来组合拼接出所有页面的url,并返回包含所有url的list
def get_all_page_urls(self, sumpage):
urls = []
baseurl = 'http://www.mmjpg.com/home/'
ul = baseurl.split('/')
for page in range(1, int(sumpage) + 1):
ul[-1] = str(page)
url = '/'.join(ul)
urls.append(url)
return urls
8.获取每个图集的链接
'''由于首页图片点击进去之后还有图片,因此首页图片是一个图集链接,所以得先获取图集链接,进而获取里面的所有图片,分析网页代码得知,可对其连接进行提取,并同样返回一个list'''
def get_page_links(self, urls):
page_links = []
for url in urls:
try:
selector = self.get_source_page(url)
lis = selector.xpath('//div[@class="pic"]//li/a/@href')
except:
continue
for li in lis:
page_links.append(li)
return page_links
9.获取图片的src属性
def get_pic_link(self, url):
try:
selector = self.get_source_page(url)
src = selector.xpath('//div[@id="content"]/a/img/@src')[0]
except:
src = None
finally:
return src
10.创建文件夹并用图集名进行命名
def mk_pic_dir(self, dirname):
path = dirname
if not os.path.exists(path):
os.mkdir(path)
return path
11.进入所有图集,并下载所有图片
def download_all_pic(self, page_links):
for page_link in page_links:
try:
selector = self.get_source_page(page_link)
album_title = selector.xpath('//div[@class="article"]/h2/text()')[0]
sum_pic = selector.xpath('//div[@id="page"]/a[last()-1]/text()')[0]
path = self.mk_pic_dir(album_title)
except:
continue
for pic in range(1, int(sum_pic) + 1):
try:
print u'正在下载-->' + album_title + u'-->第' + str(pic) + u'张美图...'
pic_link = page_link + '/' + str(pic)
src = self.get_pic_link(pic_link)
filename = '%s.jpg' % (pic)
except:
continue
else:
try:
'''增加打开图片链接时的头部referer属性'''
req = urllib2.Request(src)
req.add_header('Referer', 'http://img.mmjpg.com/')
'''写入文件'''
with open(path + '/' + filename, 'wb') as fp:
fp.write(urllib2.urlopen(src, timeout=3).read())
except:
continue
12.大功告成,运行代码
编辑器执行过程以图集名命名的文件夹
对应图集里面的所有图片
本实验的完整代码在Github上,欢迎fork
网友评论