前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
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秒,防止被识别