python 爬虫的学习
python 爬虫的学习
嘻嘻哥 发表于2年前
python 爬虫的学习
  • 发表于 2年前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

摘要: 这个是前段时间学习爬虫的时候写的,当时测试没问题,今天看了下,豆瓣妹子的网站无法访问了,不过煎蛋妹子还是能下载成功,所以也不再修改,仅作为入门学习用

以下代码该有的注释都有了,所以就不再解释了

import urllib.request
import urllib.parse
import urllib.error
import os
import re
import shutil    #高层次的文件操作模块

def delete_dir(folder):
    """删除整个目录"""
    shutil.rmtree(folder)

def make_dir(folder):
    """创建并切换到对应的目录"""
    if not os.path.exists(folder):
        os.mkdir(folder)
    os.chdir(folder)

def url_open(url):
    """打开url地址,并返回二进制的字符串数据"""
    req = urllib.request.Request(url)
    req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36")
    try:
        response = urllib.request.urlopen(req)
    except urllib.error.HTTPError as e:
        print("open url failed!, error code = ", e.code)
    else:
        return response.read()

def get_element_value(url, pattern):
    """按正则表达式在打开的url里匹配满足pattern的所有数据,并返回对应的列表"""
    s = url_open(url).decode('utf-8')
    result_list = re.findall(pattern, s)
    return list(set(result_list)) #去重复

def save_picture(img_src_list):
    """将所有的图片保存到当前目录下"""
    for img_src in img_src_list:
        file_name = img_src.split('/')[-1]
        with open(file_name, 'wb') as f:
            f.write(url_open(img_src))

def download_jiandan_mm_picture(folder, page = 10):
    """下载煎蛋妹子的图片"""
    make_dir(folder)
    
    url = "http://jandan.net/ooxx/"
    page_num = get_element_value(url, r'class="current-comment-page">\[(\d+)\]')
    page_num = int(page_num[0])
    img_src_list = []
    for i in range(page):
        sub_url = url + 'page-' + str(page_num - i) + "#comments"
        s = url_open(sub_url).decode('utf-8')
        img_src_list = re.findall(r'img src="(.*\.jpg)"', s)
        save_picture(img_src_list)

def get_category(url):
    """获取豆瓣妹子主页的分类"""
    result_list = get_element_value(url, r'href="/category/(\d+)">(.*)<')
    dd = dict(result_list)#去掉重复的key
    result_list = [(int(x),dd[x]) for x in dd]
    result_list.sort()

    print("请选择对应的分类:")
    for result in result_list:
        print("%d.\t%s" % (result[0], result[1]))

    select = input("请输入您的选择:")
    return [(result[0], result[1]) for result in result_list if result[0] == int(select)]

def download_douban_meizi_picture(folder, page = 10):
    """下载豆瓣妹子的图片"""
    make_dir(folder)

    url = "http://www.dbmeizi.com/"
    category = get_category(url)
    make_dir(category[0][1])
    url += "category/" + str(category[0][0])
    page_num = get_element_value(url, r'cgidata.page_count=(\d+)')
    page_num = int(page_num[0])
    
    img_src_list = []
    page = page_num if page_num < page else page
    for i in range(page):
        sub_url = url + '?p=' + str(i)
        s = url_open(sub_url).decode('utf-8')
        img_src_list = re.findall(r'data-src="(.*?\.jpg)"', s)#注(.*?\.jpg)里面的?表示采用非贪婪模式
        save_picture(img_src_list)

def main():
    make_dir(r'C:\Users\fgwd\Desktop\妹子图')
    
    select = input("请选择1.抓取煎蛋妹子图,2.抓取豆瓣妹子图. >>>[2]")
    pages = input("请输入抓取的页数. >>>[10]")
    if select == "":
        select = "2"

    if pages == "":
        pages = "10"

    if select == "1":
        folder = r'C:\Users\fgwd\Desktop\妹子图\煎蛋'
        download_jiandan_mm_picture(folder, int(pages))
    elif select == "2":
        folder = r'C:\Users\fgwd\Desktop\妹子图\豆瓣'
        download_douban_meizi_picture(folder, int(pages))
    else:
        print("输入有误")
        return False
    return True
    
if __name__ == "__main__":
    if main():
        print("图片下载完成")



共有 人打赏支持
粉丝 0
博文 6
码字总数 8981
×
嘻嘻哥
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: