正则爬取天堂图片网并存储在自动生成文件夹中

 

# -*- coding: utf-8 -*-
__author__ = '木之易'
__date__ = '2018/8/7 20:17'

import os
import re

from urllib import request


class WeddingImageSpider(object):

    def __init__(self, t_id):
        # 拼接完整地址
        self.url = 'http://www.ivsky.com'+t_id
        self.title = 'images'
        self.html = ''
        self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0'}
        self.create_directry()
        self.count = 0

    def create_directry(self):
        """
        创建存放图片的文件夹
        :return:
        """
        # 获取源代码
        self.get_html(self.url)
        # 2.获取帖子标题
        pattern = re.compile(r'<title>(.*?)</title>', re.S)
        # print(pattern)
        rs = re.search(pattern, self.html)
        # 3.提取帖子标题,并赋值给self.title
        if rs:
            self.title = rs.group(1)
        # 4.判断文件/目录是否存在
        if not os.path.exists(self.title):
            # 没有self.title这个文件夹,创建这个文件夹
            # mkdir() 创建文件夹
            os.mkdir(self.title)

    def get_total(self):
        """获取下一页"""
        self.get_html(self.url)
        pattern = re.compile(r'<div class="pagelist">(.*?)</div>', re.S)
        res = re.search(pattern, self.html)
        # 若找到
        if res:
            ul_html = res.group()
            # 找到含图片网址和关键字的标签
            # links = re.findall(re.compile(r"<a class='page-next' href='(.*?)</a>", re.S), ul_html)
            links = re.findall(re.compile(r"<a.*?href='(.*?)'", re.S), ul_html)
            print(links)
            print(111111111111111)
            if 'index' in links[-1]:
                # 拼接下一页完整地址
                # self.url = 'http://www.ivsky.com' + links[0][0:len(links)-6]
                self.url = 'http://www.ivsky.com' + links[-1]
                return True
            else:
                return False
        else:
            return False

    def get_html(self, url):
        # 构建请求对象
        req = request.Request(url=url, headers=self.headers)
        # 发送请求
        response = request.urlopen(req)
        # 读取相应数据
        self.html = response.read().decode('utf-8', 'ignore')

    def parser_html(self):
        # 下载地址 href = "http://img.ivsky.com/img/tupian/pic/201802/20/shatan_hunli_zhuangshi.jpg?download"
        # 图片地址 src = "http://img.ivsky.com/img/tupian/t/201802/20/shatan_hunli_zhuangshi.jpg"

        # 1.准备正则
        pattern = re.compile(r'<div class="il_img.*?<img src="(.*?)"', re.S)
        # 2.从源代码中提取数据
        result = re.findall(pattern, self.html)
        # 3.遍历下载每一张图片
        for link in result:
            self.count += 1
            print('正在下载第%s张图片' % self.count)
            # 4.拼接图片完整的存放路径
            # 自然风光图片 - 自然风景图片 (天堂图片网)/meilidehaitan-004.jpg
            path = self.title + '/' + '%s.jpg' % self.count
            # 5.下载图片
            request.urlretrieve(link, path)

    def run(self):
        count = 0
        while True:
            self.get_html(self.url)
            count += 1
            print('.........正在爬取第%s页数据,请稍后........' % count)
            self.parser_html()
            if not self.get_total():
                print('图片爬取完毕')
                break

if __name__ == '__main__':

    wedding = WeddingImageSpider('/tupian/meinv_t50/')
    wedding.run()

 

在PyCharm中使用正则表达式爬取豆瓣电影排行榜,通常需要分几步进行: 1. **安装必要的库**:首先你需要安装`requests`库来发送HTTP请求,以及`BeautifulSoup`或`re`库来进行HTML解析和正则匹配。 ```python pip install requests beautifulsoup4 ``` 2. **发送GET请求获取页面源码**: 使用`requests.get()`函数从豆瓣电影的排行榜URL抓取网页内容,比如`https://movie.douban.com/top250`。 ```python import requests url = 'https://movie.douban.com/top250' response = requests.get(url) html_content = response.text ``` 3. **解析HTML**: 将返回的HTML字符串使用`BeautifulSoup`解析,如果只是简单提取信息,也可以直接用正则表达式。`BeautifulSoup`更方便处理复杂的HTML结构。 ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'lxml') ``` 4. **使用正则表达式查找目标数据**: 查找特定元素(如电影名、评分等),可以使用`re`模块中的函数,例如`findall()`。 ```python import re # 例如,假设我们想提取所有电影标题 titles_pattern = r'<span class="title">(.*?)</span>' titles = re.findall(titles_pattern, str(soup)) # 提取评分 ratings_pattern = r'<span class="rating_num">(\d+\.\d+)</span>' ratings = [float(score) for score in re.findall(ratings_pattern, str(soup))] ``` 5. **存储结果**: 最后将数据保存到文件或数据库,或者进一步分析和可视化。 记得在实际操作中遵守网站的robots.txt规则,尊重版权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值