• [Python]爬取mzitu网站


      1 import io
      2 import os
      3 import re
      4 import sys
      5 import datetime
      6 from bs4 import BeautifulSoup
      7 from pxydowwload import request
      8 from pymongo import MongoClient
      9 
     10 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
     11 
     12 
     13 class mzitu():
     14     def __init__(self):
     15         client = MongoClient('192.168.200.11', 27017)
     16         db = client["mzitulg"]
     17         self.mzitu_collection = db["mzitulg"]
     18         self.title = ''
     19         self.url = ''
     20         self.img_urls = []  # 初始化一个 列表 用来保存图片地址
     21 
     22     def all_url(self, url):
     23         html = request.get_agent(url, 3)
     24         # html = self.request(url)  # 调用request函数把套图地址传进去会返回给我们一个response
     25         all_a = BeautifulSoup(html.text, 'lxml').find(
     26             'div', class_='postlist').find_all('a')[0:47]
     27         # print(len(all_a))
     28         for i in range(1, len(all_a) - 1, 2):
     29             a = all_a[i]
     30             title = a.get_text()
     31             self.title = title
     32             print(u'开始保存:', title)  # 加点提示不然太枯燥了
     33             # 我注意到有个标题带有 ?  这个符号Windows系统是不能创建文件夹的所以要替换掉
     34             path = str(title).replace("?", '_')
     35             self.mkdir(path)  # 调用mkdir函数创建文件夹!这儿path代表的是标题title哦!!!!!不要糊涂了哦!
     36             #os.chdir("/Users/ang/Pictures/mzitu.com/" + path)
     37             href = a['href']
     38             # 调用html函数把href参数传递过去!href是啥还记的吧? 就是套图的地址哦!!不要迷糊了哦!
     39             self.url = href  # 将页面地址保存到self.url中
     40             if self.mzitu_collection.find_one({'主题页面地址': href}):
     41                 print(u'这个页面已经爬取过!')
     42             else:
     43                 self.html(href)
     44 
     45     def html(self, href):  # 这个函数是处理套图地址获得图片的页面地址
     46         html = request.get_agent(href, 3)
     47         #html = self.request(href)
     48         max_span = BeautifulSoup(html.text, 'lxml').find_all('span')[
     49             8].get_text()
     50         page_num = 0
     51         for page in range(1, int(max_span) + 1):
     52             page_num += 1
     53             page_url = href + '/' + str(page)
     54             # 调用img函数,把上面我们我们需要的两个变量,传递给下一个函数。
     55             self.img(page_url, max_span, page_num)
     56 
     57     def img(self, page_url, max_span, page_num):  # 这个函数处理图片页面地址获得图片的实际地址
     58         img_html = request.get_agent(page_url, 3)
     59         #img_html = self.request(page_url)
     60         img_url = BeautifulSoup(img_html.text, 'lxml').find(
     61             'div', class_='main-image').find('img')['src']
     62         self.save(img_url)
     63         self.img_urls.append(img_url)
     64 
     65         if int(max_span) == page_num:
     66             self.save(img_url)
     67             post = {  # 这是构造一个字典,里面有啥都是中文,很好理解吧!
     68                 '主题页面标题': self.title,
     69                 '主题页面地址': self.url,
     70                 '主题图片地址': self.img_urls,
     71                 '主题获取时间': datetime.datetime.now()
     72             }
     73             self.mzitu_collection.save(post)
     74             print(u'插入数据库成功!')
     75         else:
     76             self.save(img_url)
     77 
     78     def save(self, img_url):  # 这个函数保存图片
     79         name = img_url[-9:-4]
     80         print(u'开始保存:', img_url)
     81         img = request.get_agent(img_url, 3)
     82         #img = self.request(img_url)
     83         fp = open(name + '.jpg', 'ab')
     84         fp.write(img.content)
     85         fp.close()
     86 
     87     def mkdir(self, path):  # 这个函数创建文件夹
     88         path = path.strip()
     89         isExists = os.path.exists(os.path.join(
     90             "/Users/ang/Pictures/mzitu.com", path))
     91         if not isExists:
     92             print(u'建了一个名字叫做', path, u'的文件夹!')
     93             os.makedirs(os.path.join(
     94                 "/Users/ang/Pictures/mzitu.com", path))
     95             os.chdir(os.path.join("/Users/ang/Pictures/mzitu.com", path))
     96             # # 切换到目录
     97             return True
     98         else:
     99             print(u'名字叫做', path, u'的文件夹已经存在了!')
    100             os.chdir(os.path.join("/Users/ang/Pictures/mzitu.com", path))
    101             return False
    102 
    103     """
    104     def request(self, url):  # 这个函数获取网页的response 然后返回
    105         headers = {
    106             'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
    107         content = requests.get(url, headers=headers)
    108         return content
    109     """
    110 
    111 
    112 Mzitu = mzitu()  # 实例化
    113 # 给函数all_url传入参数  你可以当作启动爬虫(就是入口)
    114 Mzitu.all_url('http://www.mzitu.com/xinggan')
  • 相关阅读:
    用Java redis 实现发送手机验证码的功能
    redis之Java Jedis 的使用(使用maven引入)
    设计模式之代理模式
    Redis相关配置
    Redis五大数据类型
    设计模式之享元模式
    设计模式之外观模式
    设计模式之组合模式
    设计模式之装饰者模式
    设计模式之适配器模式
  • 原文地址:https://www.cnblogs.com/Start12/p/9342126.html
Copyright © 2020-2023  润新知