利用python正则表达式爬取图片

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
python免费学习资料以及群交流解答点击即可加入

###利用正则表达式匹配字符串爬取***的美女图片,保存相关数据到MongoDB并且把相关图片保存在本地###
from parse_config import *
import requests
import re
import json
import time
import pymongo
from requests.exceptions import RequestException
import hashlib
'''
遇到不懂的问题?Python学习交流群:1136201545
满足你的需求,资料都已经上传群文件,可以自行下载!
'''
db_client = pymongo.MongoClient(mongo_url)  # 初始化MongoDB数据库对象
db = db_client[mongo_database]  # 引用实例


def get_responses(url):  # 定义获取response函数
    try:
        responses = requests.get(url, headers=headers)
        if responses.status_code == 200:  # 判断是否请求成功,利用.text方法返回html代码
            return responses.text
        else:
            return None
    except RequestException:  # 捕获父类异常
        print('error1')
        return None


def get_image_content(url):  # 定义函数
    try:
        responses = requests.get(url, headers=headers)
        if responses.status_code == 200:
            return responses.content  # 利用.content方法返回二进制文件
        else:
            return None
    except RequestException:
        print('error2')
        return None


def download_image(content):
    filename = '{0}.{1}'.format(hashlib.md5(content).hexdigest(), 'jpg')  # 字符串的通配方法
    with open(path_image.format(filename), 'wb')as f:  # 'wb'保存图片
        f.write(content)
        print(filename,'下载成功!')
        f.close()


def get_url_items(html):
    pattern = re.compile('<li>.*?<a.*?href="(.*?)".*?class="TypeBigPics".*?src="(.*?)".*?<span>(.*?)</span>'
                         + '.*?class="IcoList">(.*?)</em>.*?class="IcoTime">(.*?)</em>', re.S)
    items = re.findall(pattern, html)  # 利用re库的compile方法构造正则表达式,findall方法获取items
    for item in items:
        yield {
            '名称': item[2],
            '壁纸': item[1],
            '网址': item[0],
            '发布日期': item[4],
            '查看次数': item[3][3:]
        }  # yield生成器,被调用时才赋值
        content = get_image_content(item[1])
        download_image(content)


def save_to_file(filename,file_type,text):  # 保存至本地
    with open('{}{}{}'.format(path_txt, filename,file_type), 'a', encoding='utf-8', )as wf:  # 以utf-8的编码方式追加到文件
        wf.write(json.dumps(text, ensure_ascii=False) + '\n')  # 解码相关json格式
        print(text,'写入到本地成功!')
        wf.close()


def save_to_mongo(text):  # 存储到MongoDB
    if db[mongo_table].insert(text):
        print(text,'写入Mongo成功!')
        return True
    return False


def main(filename, page):
    url = 'http://www.***/bizhitupian/meinvbizhi/{}.htm'.format(page)
    html = get_responses(url)
    items = get_url_items(html)
    for item in items:
        save_to_file(filename,file_type, item)
        save_to_mongo(item)


if __name__ == '__main__':
    for page in range(start_page, end_page + 1):
        main(file, page)
        time.sleep(15)#等待15秒,防止被识别
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值