鱼C论坛

 找回密码
 立即注册
查看: 2483|回复: 4

[已解决]关于Python爬取妹子图问题

[复制链接]
发表于 2017-11-25 21:33:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wongyusing 于 2017-11-26 17:36 编辑

初步代码如下:
  1. import re
  2. import urllib
  3. import os
  4. import requests

  5. def url_open(url):  # 网页打开函数,以防被禁
  6.     headers = {
  7.         'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36"}
  8.     req = requests.get(url, headers=headers)
  9.     req.encoding = 'utf-8'
  10.     return req.text

  11. def get_folder(url):#文件夹名称
  12.     ret = url_open(url)
  13.     reg = r'<a href="/.*?/">(.*?)</a>'
  14.     folder_name = re.findall(reg,ret)
  15.     return folder_name

  16. def get_folder_url(url):#类型的url后缀
  17.     ret = url_open(url)
  18.     reg = r'<a href="/(.*?)/">.*?</a>'
  19.     folder_url = re.findall(reg, ret)
  20.     return folder_url







  21. def mmp_down():#主函数
  22.     url = 'http://www.2meinv.com/'
  23.     folder_url = get_folder_url(url) #获取分类的url后缀
  24.     for i in folder_url:
  25.         folder_url_a = url + i #拼接分类的url
  26.         print(folder_url_a)











  27. if __name__ == "__main__":
  28.     mmp_down()
复制代码


该爬虫目标是要爬取全站的妹子图,并且按照分类下载到4个文件夹中,再按妹子名再保存到一个文件夹中,但在分类上遇到了一些问题;
问题主要是当点开分类的第一页,url没有后缀,第二页开始有后缀.
当点开妹子图时,第一页也是没有后缀,第二页是会有后缀的.
如果强行把后缀改为1后,会出现错误的网站.
我是该先从获得分类第一页开始下载妹子图,还是遍历分类所有的后缀收集成一个列表后再加上第一页的url再进行下载妹子图呢?

现在问题变成了无法获取妹子图片集的页码了,浏览器能看到,但Python看不到

       
最佳答案
2017-11-26 14:00:31
import requests
import os
import re


def request_url(url):
    mock_header = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \
        (KHTML, like Gecko) Ubuntu Chromium/62.0.3202.94 Chrome/62.0.3202.94 Safari/537.36'}
    resp = requests.get(url, headers=mock_header)
    resp.encoding = 'utf-8'
    return resp.text


def get_dir(url):
    # request
    resp = request_url(url)
    resp_reg = r'<a href="(/.*?/)">(.*?)</a>'
    resp_result = re.findall(resp_reg, resp)
    return resp_result


def get_dir_pic(base_url, path):
    # request
    resp = request_url(base_url + path)
    # <img src="http://20170901.sina678.com/uploads/170930/1506739524-VNHZB.jpg" width="636" alt="极品诱惑丰乳肥臀美女邝凯欣性感撩人" />
    resp_reg_node = r'<img src="(http://.*?)".*?alt="(.*?)" />'
    # resp_reg = r'<img src="(http://.*?)" width="\d+" alt="(.*?)" />'
    resp_result = re.findall(resp_reg_node, resp)

    # <a href="/siwameitui/index_54.html" target="_self">54</a>
    # <a href="/siwameitui/index_2.html" target="_self">2</a>
    if str(path).endswith('/'):
        resp_reg_last_page = r'<a href="' + path + 'index_\d+\.html" target="_self">(\d+)</a>'
        resp_page = re.findall(resp_reg_last_page, resp)
        return resp_result, resp_page[len(resp_page) - 1]

    return resp_result


def download_pic(save_dir, pic_tuple):
    for pic in pic_tuple:
        try:
            resp = requests.get(pic[0])
        except BaseException:
            continue

        pic_path = os.path.join(save_dir, pic[1] + str(pic[0])[str(pic[0]).rindex('.'):])
        if not os.path.exists(pic_path):
            os.mknod(pic_path)
        with open(pic_path, 'wb') as f:
            f.write(resp.content)


def down_all_pic():
    url = 'http://www.2meinv.com'
    dirs = get_dir(url)
    for path, dir_name in dirs:
        # create dir
        save_dir = os.path.join(os.getcwd(), '2mienv', dir_name)
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        resp_first_totalPage = get_dir_pic(url, path)
        download_pic(save_dir, resp_first_totalPage[0])
        for page in range(int(resp_first_totalPage[1])):
            download_pic(save_dir, get_dir_pic(url, path + 'index_' + str(int(page) + 2) + '.html'))


if __name__ == '__main__':
    down_all_pic()
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-11-26 10:23:56 | 显示全部楼层
我觉得你问的这个不是什么问题,只是你该如何取舍的事情,你完全可以自己想清楚之后去做
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-26 14:00:31 | 显示全部楼层    本楼为最佳答案   
import requests
import os
import re


def request_url(url):
    mock_header = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \
        (KHTML, like Gecko) Ubuntu Chromium/62.0.3202.94 Chrome/62.0.3202.94 Safari/537.36'}
    resp = requests.get(url, headers=mock_header)
    resp.encoding = 'utf-8'
    return resp.text


def get_dir(url):
    # request
    resp = request_url(url)
    resp_reg = r'<a href="(/.*?/)">(.*?)</a>'
    resp_result = re.findall(resp_reg, resp)
    return resp_result


def get_dir_pic(base_url, path):
    # request
    resp = request_url(base_url + path)
    # <img src="http://20170901.sina678.com/uploads/170930/1506739524-VNHZB.jpg" width="636" alt="极品诱惑丰乳肥臀美女邝凯欣性感撩人" />
    resp_reg_node = r'<img src="(http://.*?)".*?alt="(.*?)" />'
    # resp_reg = r'<img src="(http://.*?)" width="\d+" alt="(.*?)" />'
    resp_result = re.findall(resp_reg_node, resp)

    # <a href="/siwameitui/index_54.html" target="_self">54</a>
    # <a href="/siwameitui/index_2.html" target="_self">2</a>
    if str(path).endswith('/'):
        resp_reg_last_page = r'<a href="' + path + 'index_\d+\.html" target="_self">(\d+)</a>'
        resp_page = re.findall(resp_reg_last_page, resp)
        return resp_result, resp_page[len(resp_page) - 1]

    return resp_result


def download_pic(save_dir, pic_tuple):
    for pic in pic_tuple:
        try:
            resp = requests.get(pic[0])
        except BaseException:
            continue

        pic_path = os.path.join(save_dir, pic[1] + str(pic[0])[str(pic[0]).rindex('.'):])
        if not os.path.exists(pic_path):
            os.mknod(pic_path)
        with open(pic_path, 'wb') as f:
            f.write(resp.content)


def down_all_pic():
    url = 'http://www.2meinv.com'
    dirs = get_dir(url)
    for path, dir_name in dirs:
        # create dir
        save_dir = os.path.join(os.getcwd(), '2mienv', dir_name)
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        resp_first_totalPage = get_dir_pic(url, path)
        download_pic(save_dir, resp_first_totalPage[0])
        for page in range(int(resp_first_totalPage[1])):
            download_pic(save_dir, get_dir_pic(url, path + 'index_' + str(int(page) + 2) + '.html'))


if __name__ == '__main__':
    down_all_pic()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-26 17:30:49 | 显示全部楼层
$DIM 发表于 2017-11-26 14:00
import requests
import os
import re

大哥,代码要放进代码哪里写的,就编辑的<>按钮里面,不然版主会提醒你的,还有代码要尽量加点注释像这个样子.
如下:
  1. import requests
  2. import os
  3. import re


  4. def request_url(url):#网页打开函数
  5.     mock_header = {
  6.         'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 \
  7.         (KHTML, like Gecko) Ubuntu Chromium/62.0.3202.94 Chrome/62.0.3202.94 Safari/537.36'}
  8.     resp = requests.get(url, headers=mock_header)
  9.     resp.encoding = 'utf-8'
  10.     return resp.text


  11. def get_dir(url):#获取分类的名称和后缀
  12.     # request
  13.     resp = request_url(url)
  14.     resp_reg = r'<a href="(/.*?/)">(.*?)</a>'
  15.     resp_result = re.findall(resp_reg, resp)
  16.     return resp_result


  17. def get_dir_pic(base_url, path):#获取图片的地址
  18.     # request
  19.     resp = request_url(base_url + path)#获取分类页码
  20.     # <img src="http://20170901.sina678.com/uploads/170930/1506739524-VNHZB.jpg" width="636" alt="极品诱惑丰乳肥臀美女邝凯欣性感撩人" />
  21.     resp_reg_node = r'<img src="(http://.*?)".*?alt="(.*?)" />'
  22.     # resp_reg = r'<img src="(http://.*?)" width="\d+" alt="(.*?)" />'
  23.     resp_result = re.findall(resp_reg_node, resp)

  24.     # <a href="/siwameitui/index_54.html" target="_self">54</a>
  25.     # <a href="/siwameitui/index_2.html" target="_self">2</a>
  26.     if str(path).endswith('/'):
  27.         resp_reg_last_page = r'<a href="' + path + 'index_\d+\.html" target="_self">(\d+)</a>'
  28.         resp_page = re.findall(resp_reg_last_page, resp)
  29.         return resp_result, resp_page[len(resp_page) - 1]

  30.     return resp_result


  31. def download_pic(save_dir, pic_tuple):#保存图片函数
  32.     for pic in pic_tuple:
  33.         try:
  34.             resp = requests.get(pic[0])
  35.         except BaseException:
  36.             continue

  37.         pic_path = os.path.join(save_dir, pic[1] + str(pic[0])[str(pic[0]).rindex('.'):])
  38.         if not os.path.exists(pic_path):
  39.             os.mknod(pic_path)
  40.         with open(pic_path, 'wb') as f:
  41.             f.write(resp.content)


  42. def down_all_pic():#主函数
  43.     url = 'http://www.2meinv.com'
  44.     dirs = get_dir(url)#获取分类后缀和名称
  45.     for path, dir_name in dirs:
  46.         # create dir
  47.         save_dir = os.path.join(os.getcwd(), '2mienv', dir_name)#在"2mienv"文件夹中创建分类文件夹
  48.         if not os.path.exists(save_dir):#如果文件夹存在则切换到该文件夹
  49.             os.makedirs(save_dir)
  50.         resp_first_totalPage = get_dir_pic(url, path)#拼接分类页码
  51.         download_pic(save_dir, resp_first_totalPage[0])
  52.         for page in range(int(resp_first_totalPage[1])):#根据分类页码遍历分类中所有图片
  53.             download_pic(save_dir, get_dir_pic(url, path + 'index_' + str(int(page) + 2) + '.html'))


  54. if __name__ == '__main__':
  55.     down_all_pic()
复制代码

其实我的目标是要进入到图片集里面.
0.是先分四个类别创建各自的文件夹
1.然后按照标题各自创建一个文件夹
2.最后把该妹子图片都保存标题的文件夹中

最后麻烦你帮我看一下我的代码,就差获取'图片集'中的页码问题了,在浏览器中能看到需要正则的地方,但是在Python中需要正则的地方就找不到.
代码在楼下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-26 17:31:57 | 显示全部楼层
本帖最后由 wongyusing 于 2017-11-26 17:34 编辑

问题都在代码里,
代码如下:
  1. import re
  2. import urllib
  3. import os
  4. import requests
  5. #目标爬取全站的妹子图片,并按照分类分别创建4个文件夹,然后按照妹子'标题'创建文件夹,最后按照该标题下载图片,一个妹子大概有40页.

  6. def url_open(url):  # 网页打开函数,以防被禁
  7.     headers = {
  8.         'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36"}
  9.     req = requests.get(url, headers=headers)
  10.     req.encoding = 'utf-8'
  11.     return req.text

  12. def get_folder(url):#文件夹名称
  13.     ret = url_open(url)
  14.     reg = r'<a href="/.*?/">(.*?)</a>'
  15.     folder_name = re.findall(reg,ret)
  16.     return folder_name

  17. def get_folder_url(url):#类型的url后缀
  18.     ret = url_open(url)
  19.     reg = r'<a href="/(.*?)/">.*?</a>'
  20.     folder_url = re.findall(reg, ret)
  21.     return folder_url

  22. def get_page_num(folder_url_a):#获取分类的页码数
  23.     ret = url_open(folder_url_a)
  24.     reg = r'<a href="/.*?/index_(.*?).html" target="_self">.*?</a>'
  25.     page_max = re.findall(reg,ret)
  26.     return page_max[-1]
  27. def get_img_url(page_url):#获取图片首页url后缀列表
  28.     ret = url_open(page_url)
  29.     reg = r'<a href="/(.*?)" target="_blank"><img'
  30.     img_url = re.findall(reg,ret)
  31.     return img_url




  32. def get_img_page(img_add_url):#获取图片集页码
  33.     ret = url_open(img_add_url)                 #问题出在这个函数里的正则
  34.     #reg = r'<a href="?url=.*?" class="all">...(.*?)</a>'#该正则表达式浏览器上能看到
  35.     #html = re.findall(reg,ret,re.S)                     #但在Python中看不到
  36.     print(ret)#通过打印发现没有需要正则的地方,但在浏览器却能看到
  37.     #return html


  38. def save_tu(img_url_ok):#保存图片函数
  39.     pass


  40. def mmp_down():#主函数
  41.     url = 'http://www.2meinv.com/'
  42.     folder_url = get_folder_url(url) #获取分类的url后缀
  43.     for i in folder_url:
  44.         folder_url_a = url + i #拼接分类的url
  45.         #print(folder_url_a)
  46.         page_num = get_page_num(folder_url_a)#获取各分类的页码
  47.         for a in range(2,int(page_num)+1):
  48.             page_url = folder_url_a + '/index_' + str(a) +'.html'
  49.             #print(page_url)
  50.             img_url = get_img_url(page_url) #获取图片首页url后缀列表
  51.             #print(img_url)
  52.             for b in img_url:
  53.                 img_add_url = url + b#拼接图片url首页
  54.                 print(img_add_url)
  55.                 img_page = get_img_page(img_add_url)#获取'图片集'页码#问题出在这里,上面函数部分有问题讲解
  56.                 print(img_page)
  57.                 #for c in range(2,int(img_page)+1):
  58.                     #img_url_ok = img_add_url + '?url=' + str(c)
  59.                     #print(img_url_ok)
  60.                     #save_img = save_tu(img_url_ok)


  61. if __name__ == "__main__":
  62.     mmp_down()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-4 07:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表