鱼C论坛

 找回密码
 立即注册
查看: 106|回复: 5

[已解决]求大佬帮忙看下我的爬虫代码出了什么问题??

[复制链接]
发表于 2024-12-11 22:47:14 | 显示全部楼层 |阅读模式

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

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

x
背景如下:爬取 https://pic.yxdown.com/ 上面的图片 希望达到:每个系列有个 文件夹  里面 保存该主题的所有图片  ,但是 我执行了后 一直没有反应 不知道哪里出了问题
import json
import os.path
import re
import urllib
from concurrent.futures import ThreadPoolExecutor
import requests
from bs4 import BeautifulSoup
import logging
import random
from pathlib import Path

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
agent_list = ["Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
        "Avant Browser/1.2.789rel1 (http://www.avantbrowser.com)",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
        "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
        "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
        "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"]
MAX_FILENAME_LENGTH = 255

def sanitize_path(path):
    # return os.path.abspath(os.path.expanduser(path))
    return Path(path).expanduser().resolve()

def sanitize_directory_name(name):
    name = re.sub(r'[\\/*? :"<>|]','',name)
    # max_length = 255
    if len(name)> MAX_FILENAME_LENGTH:
        name = name[:MAX_FILENAME_LENGTH]
    return name

def download_image(img_url, img_save_path):
    try:
        response =requests.get(img_url, timeout=10)
        response.raise_for_status()
        with open(img_save_path, 'wb') as f:
            f.write(response.content)
        logging.info('图片已保存:%s',img_save_path)
    except requests.RequestException as e:
        logging.error('下载图片发生错误:%s',e)

def choice_agent(agent_list):
    return random.choice(agent_list)

def get_html(url, headers):
    """
    解析网页内容的方法
    解析每个url地址的公共方法
    :param url:
    :param headers:
    :return:
    """
    try:
        headers ={'User-Agent': choice_agent(headers)}
        html = requests.get(url, headers=headers, timeout=10)
        html.raise_for_status()
        html.encoding = 'utf-8'
        logging.info('get_html: ' + url)
        logging.info('获取页面:'+ url)
        print(html.text)
        return html.text
    except requests.RequestException as e:
        logging.error('请求错误:%s', e)
        return None

def get_all_serials_image_info(url, headers):
    """
    获取 当前url 上 所有系列图片的 地址 ,点击后可以跳转
    :param url:
    :param headers:
    :return:
    """
    try:
        headers ={'User-Agent': choice_agent(headers)}
        html = get_html(url, headers=headers)
        if not html:
            logging.error('未获取到页面')
            return None
        soup = BeautifulSoup(html,'html.parser')
        all_img_info = soup.find_all('div', class_='cbmiddle')
        all_serials_image_info = [] # 获取 当前url 上 所有系列图片的 地址
        data_list =[]
        for img_info in all_img_info:
            img_cover = img_info.find('img')
            img_title = img_info.find('b', class_='imagname').text
            img_viewer = img_info.find('span').text
            img_quantity = img_info.find('em').text
            img_url = "https://pic.yxdown.com/"+ img_info.get('href')
            all_serials_image_info.append(img_url)
            data_list.append({
                'img_cover': img_cover,
                'img_title': img_title,
                'img_viewer': img_viewer,
                'img_quantity': img_quantity,
                'img_url': img_url
            })
        print(data_list)
        print(all_serials_image_info)
        return data_list,all_serials_image_info
    except Exception as e:
        logging.error('获取图片信息时发生错误: %s',e)
        return None

def get_every_serial_info(url, headers):
    try:
        headers ={'User-Agent': choice_agent(headers)}
        data_list,all_serials_image_info = get_all_serials_image_info(url, headers=headers)
        if not data_list:
            logging.error('未获取到图片信息')
            return
        with ThreadPoolExecutor(max_workers=10) as executor:
            logging.info('开始下载图片')
            futures =[]
            for data in data_list:
                img_title = sanitize_directory_name(data['img_title'])
                if not os.path.exists(img_title):
                    os.makedirs(img_title)
                for i in range(1,int(len(data['img_quantity']))+ 1):
                    each_img_html = data['img_url']+'#p='+ str(i)
                    html = get_html(each_img_html, headers=headers)
                    if not html:
                        continue
                    soup = BeautifulSoup(html, 'html.parser' )
                    each_img_url = soup.find('img')['src']
                    image_name = os.path.basename(each_img_url)
                    img_save_path = os.path.join(img_title, image_name)
                    futures.append(executor.submit(download_image,each_img_html, img_save_path))
            for future in futures:
                future.result()
    except requests.RequestException as e:
        logging.error('请求错误:%s',e)
    except Exception as e:
        logging.error('其他错误:%s',e)
    except requests.HTTPError as e:
        logging.error('HTTP错误:%s,状态码:%d', e, e.response.status_code)
    except requests.ConnectionError as e:
        logging.error('连接错误:%s', e)
if __name__ == ' main ':
    url = "https://pic.yxdown.com/"
    headers = agent_list
    data_list, all_serials_image_info = get_all_serials_image_info(url, headers=headers)
    for data in data_list:
        get_every_serial_info(data['img_url'], agent_list)
最佳答案
2024-12-12 14:52:40
问题有点大啊(自己看法) 不知道有没有来得及 已经尽力赶了 早上10点看见的  帮你修改了一点 现在是可以正常运行和下载图片 由于本人是个小白所以可能没办法给出最好的代码
给一点我的理解:get_every_serial_info 这块问题最大 我测到最后时候发现每次拼接#p= 它的图片url都不会变后面去看了源码 发现对不上 猜测可能是js缘故 但是看到了有script代码<script>var images = .... 里面有当前页面的所有图片链接 所以就直接获取里面url 其次这块思路可能有点问题 获取图片url和后期下载图片代码都用了同一块get_all_serials_image_info函数 主要问题就是前后两块不可能页面布局一模一样就会导致很多获取有问题
以上是我的见解 希望可以帮助到你 下面是修改好的代码 共勉~


import json
import os.path
import re
import urllib
from concurrent.futures import ThreadPoolExecutor
import requests
from bs4 import BeautifulSoup
import logging
import random
from pathlib import Path

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
agent_list = ["Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
        "Avant Browser/1.2.789rel1 (url)",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
        "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
        "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
        "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"]
MAX_FILENAME_LENGTH = 255

def sanitize_path(path):
    # return os.path.abspath(os.path.expanduser(path))
    return Path(path).expanduser().resolve()

def sanitize_directory_name(name):
    name = re.sub(r'[\\/*? :"<>|]','',name)
    # max_length = 255
    if len(name)> MAX_FILENAME_LENGTH:
        name = name[:MAX_FILENAME_LENGTH]
    return name

def download_image(img_url, img_save_path):
    try:
        # print("下载:",img_url,img_save_path)
        response =requests.get(img_url, timeout=10)
        response.raise_for_status()
        with open(img_save_path, 'wb') as f:
            f.write(response.content)
        logging.info('图片已保存:%s',img_save_path)
    except requests.RequestException as e:
        logging.error('下载图片发生错误:%s',e)

def choice_agent(agent_list):
    return random.choice(agent_list)

def get_html(url, headers):
    """
    解析网页内容的方法
    解析每个url地址的公共方法
    :param url:
    :param headers:
    :return:
    """
    try:
        # headers ={'User-Agent': choice_agent(headers)}
        headers =headers
        # 第一次传进来的已经是一个完整的headers了 所以不需要再加一次
        # print(headers)
        html = requests.get(url, headers=headers, timeout=10)
        html.raise_for_status()
        html.encoding = 'utf-8'
        logging.info('get_html: ' + url)
        logging.info('获取页面:'+ url)
        # print(html.text)
        return html.text
    except requests.RequestException as e:
        logging.error('请求错误:%s', e)
        return None

def get_all_serials_image_info(url, headers):
    """
    获取 当前url 上 所有系列图片的 地址 ,点击后可以跳转
    :param url:
    :param headers:
    :return:
    """
    try:
        headers ={'User-Agent': choice_agent(headers)}
        # headers =headers
        html = get_html(url, headers=headers)
        if not html:
            logging.error('未获取到页面')
            return None
        soup = BeautifulSoup(html,'html.parser')
        all_img_info = soup.find_all('div', class_='cbmiddle')
        all_serials_image_info = [] # 获取 当前url 上 所有系列图片的 地址
        data_list =[]
        for img_info in all_img_info[1:]:
            # 修改 因为第一次的img_info 取到的是标题块的 不是内容 所以没有img这个标签
            # print(img_info)
            img_cover = img_info.find('img')
            img_title = img_info.find('b', class_='imgname').text
            # 修改:imgname字打错
            img_viewer = img_info.find('span').text
            img_quantity = img_info.find('em').text
            # img_url = "pic.yxdown.com(url)"+ img_info.get('href')
            img_url = "pic.yxdown.com(url)"+img_info.find("a", class_="proimg").get('href')
            # 修改 img_info是一整个列表(不大会表达) 直接.get获取不到 因为都是标签 .get是获取标签内部的属性
            all_serials_image_info.append(img_url)
            data_list.append({
                'img_cover': f'{img_cover}',
                'img_title': f'{img_title}',
                'img_viewer': f'{img_viewer}',
                'img_quantity': f'{img_quantity}',
                'img_url': f'{img_url}'
            })
        print(data_list)
        print(all_serials_image_info)
        return data_list,all_serials_image_info
    except Exception as e:
        logging.error('获取图片信息时发生错误: %s',e)
        return None

def get_every_serial_info(url, headers,data):
    try:
        respon = requests.get(url, headers=headers)
        # 这里没有用get_html 我认为没必要再调用一次那个自定义函数浪费内存 如果为了方便看倒是可以
        # 思路:由于尝试过获取每一页然后获取图片 发现每次都是一个url 页面上看了也是 所以只能获取js里的url
        if respon.status_code == 200:
            # 状态码200
            each_img_url = re.findall('\"big\":\"(.*?)\"', respon.text, re.S)
            # 正则提取 将所有图片放入列表里
            # print(each_img_url)

        with ThreadPoolExecutor(max_workers=10) as executor:
            logging.info('开始下载图片')
            img_title = sanitize_directory_name(data['img_title'])
            if not os.path.exists(img_title):
                os.makedirs(img_title)

            image_name = [os.path.basename(url) for url in each_img_url]
            # 列表推导式 处理列表里的url 获取文件名
            img_save_path = [os.path.join(img_title, name) for name in image_name]
            executor.map(download_image, each_img_url, img_save_path)
            # 传入两个列表 但是内部是一个一个值传进去
                # 这边each_img的url用错 是each_img_url
        # 多线程的这个可以不用 好像是会相当于for语句 不会提速
        #         futures.append(executor.submit(download_image,each_img_html, img_save_path))
        # for future in futures:
        #     future.result()
    except requests.RequestException as e:
        logging.error('请求错误:%s',e)
    except Exception as e:
        logging.error('其他错误:%s',e)
    except requests.HTTPError as e:
        logging.error('HTTP错误:%s,状态码:%d', e, e.response.status_code)
    except requests.ConnectionError as e:
        logging.error('连接错误:%s', e)
if __name__ == '__main__':
    url = "ic.yxdown.com(url)"
    headers = agent_list
    data_list, all_serials_image_info = get_all_serials_image_info(url, headers=headers)
    for data in data_list:
        # print(data)
        get_every_serial_info(data['img_url'], {"User-Agent":choice_agent(agent_list)}, data)
        # 这里把data直接传入 后面直接调用

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
menghuanzdr + 5 + 5 + 3 符号你用的中文要英文

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-11 22:47:27 | 显示全部楼层
你的代码有以下几个问题,需要修正:

1. **`__name__`的判断错误**:你在判断`__name__`时有多余的空格,Python不会识别它。应该用`if __name__ == '__main__':`。

2. **变量未初始化**:
   - 在`get_all_serials_image_info`函数中,`all_serials_image_info`和`data_list`没有初始化。
   - 在`get_every_serial_info`函数中,`futures`没有初始化。

3. **错误的使用`requests.get`**:你的`get_html`函数重复定义了`headers`变量,导致传入的`headers`无效。

4. **解析图片URL的错误**:在`soup.find('img')`中,你只是返回了标签对象,而不是提取其`src`属性,这样无法获得图片的真实URL。

下面是修正后关键部分的示例:
def get_all_serials_image_info(url, headers):
    ...
    all_serials_image_info = []
    data_list = []
    ...

def get_every_serial_info(url, headers):
    ...
    futures = []
    ...

def get_html(url, headers):
    try:
        headers = {'User-Agent': choice_agent(agent_list)}
        ...

确保调用时正确检查`__name__`变量:
if __name__ == '__main__':
    ...

检查这些问题并依次修正后,重新运行你的爬虫。可能还会遇到网站结构改变或反爬虫措施的问题,请尽量捕获相关异常进行调试。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-12 14:52:40 | 显示全部楼层    本楼为最佳答案   
问题有点大啊(自己看法) 不知道有没有来得及 已经尽力赶了 早上10点看见的  帮你修改了一点 现在是可以正常运行和下载图片 由于本人是个小白所以可能没办法给出最好的代码
给一点我的理解:get_every_serial_info 这块问题最大 我测到最后时候发现每次拼接#p= 它的图片url都不会变后面去看了源码 发现对不上 猜测可能是js缘故 但是看到了有script代码<script>var images = .... 里面有当前页面的所有图片链接 所以就直接获取里面url 其次这块思路可能有点问题 获取图片url和后期下载图片代码都用了同一块get_all_serials_image_info函数 主要问题就是前后两块不可能页面布局一模一样就会导致很多获取有问题
以上是我的见解 希望可以帮助到你 下面是修改好的代码 共勉~


import json
import os.path
import re
import urllib
from concurrent.futures import ThreadPoolExecutor
import requests
from bs4 import BeautifulSoup
import logging
import random
from pathlib import Path

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
agent_list = ["Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
        "Avant Browser/1.2.789rel1 (url)",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
        "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
        "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
        "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10"]
MAX_FILENAME_LENGTH = 255

def sanitize_path(path):
    # return os.path.abspath(os.path.expanduser(path))
    return Path(path).expanduser().resolve()

def sanitize_directory_name(name):
    name = re.sub(r'[\\/*? :"<>|]','',name)
    # max_length = 255
    if len(name)> MAX_FILENAME_LENGTH:
        name = name[:MAX_FILENAME_LENGTH]
    return name

def download_image(img_url, img_save_path):
    try:
        # print("下载:",img_url,img_save_path)
        response =requests.get(img_url, timeout=10)
        response.raise_for_status()
        with open(img_save_path, 'wb') as f:
            f.write(response.content)
        logging.info('图片已保存:%s',img_save_path)
    except requests.RequestException as e:
        logging.error('下载图片发生错误:%s',e)

def choice_agent(agent_list):
    return random.choice(agent_list)

def get_html(url, headers):
    """
    解析网页内容的方法
    解析每个url地址的公共方法
    :param url:
    :param headers:
    :return:
    """
    try:
        # headers ={'User-Agent': choice_agent(headers)}
        headers =headers
        # 第一次传进来的已经是一个完整的headers了 所以不需要再加一次
        # print(headers)
        html = requests.get(url, headers=headers, timeout=10)
        html.raise_for_status()
        html.encoding = 'utf-8'
        logging.info('get_html: ' + url)
        logging.info('获取页面:'+ url)
        # print(html.text)
        return html.text
    except requests.RequestException as e:
        logging.error('请求错误:%s', e)
        return None

def get_all_serials_image_info(url, headers):
    """
    获取 当前url 上 所有系列图片的 地址 ,点击后可以跳转
    :param url:
    :param headers:
    :return:
    """
    try:
        headers ={'User-Agent': choice_agent(headers)}
        # headers =headers
        html = get_html(url, headers=headers)
        if not html:
            logging.error('未获取到页面')
            return None
        soup = BeautifulSoup(html,'html.parser')
        all_img_info = soup.find_all('div', class_='cbmiddle')
        all_serials_image_info = [] # 获取 当前url 上 所有系列图片的 地址
        data_list =[]
        for img_info in all_img_info[1:]:
            # 修改 因为第一次的img_info 取到的是标题块的 不是内容 所以没有img这个标签
            # print(img_info)
            img_cover = img_info.find('img')
            img_title = img_info.find('b', class_='imgname').text
            # 修改:imgname字打错
            img_viewer = img_info.find('span').text
            img_quantity = img_info.find('em').text
            # img_url = "pic.yxdown.com(url)"+ img_info.get('href')
            img_url = "pic.yxdown.com(url)"+img_info.find("a", class_="proimg").get('href')
            # 修改 img_info是一整个列表(不大会表达) 直接.get获取不到 因为都是标签 .get是获取标签内部的属性
            all_serials_image_info.append(img_url)
            data_list.append({
                'img_cover': f'{img_cover}',
                'img_title': f'{img_title}',
                'img_viewer': f'{img_viewer}',
                'img_quantity': f'{img_quantity}',
                'img_url': f'{img_url}'
            })
        print(data_list)
        print(all_serials_image_info)
        return data_list,all_serials_image_info
    except Exception as e:
        logging.error('获取图片信息时发生错误: %s',e)
        return None

def get_every_serial_info(url, headers,data):
    try:
        respon = requests.get(url, headers=headers)
        # 这里没有用get_html 我认为没必要再调用一次那个自定义函数浪费内存 如果为了方便看倒是可以
        # 思路:由于尝试过获取每一页然后获取图片 发现每次都是一个url 页面上看了也是 所以只能获取js里的url
        if respon.status_code == 200:
            # 状态码200
            each_img_url = re.findall('\"big\":\"(.*?)\"', respon.text, re.S)
            # 正则提取 将所有图片放入列表里
            # print(each_img_url)

        with ThreadPoolExecutor(max_workers=10) as executor:
            logging.info('开始下载图片')
            img_title = sanitize_directory_name(data['img_title'])
            if not os.path.exists(img_title):
                os.makedirs(img_title)

            image_name = [os.path.basename(url) for url in each_img_url]
            # 列表推导式 处理列表里的url 获取文件名
            img_save_path = [os.path.join(img_title, name) for name in image_name]
            executor.map(download_image, each_img_url, img_save_path)
            # 传入两个列表 但是内部是一个一个值传进去
                # 这边each_img的url用错 是each_img_url
        # 多线程的这个可以不用 好像是会相当于for语句 不会提速
        #         futures.append(executor.submit(download_image,each_img_html, img_save_path))
        # for future in futures:
        #     future.result()
    except requests.RequestException as e:
        logging.error('请求错误:%s',e)
    except Exception as e:
        logging.error('其他错误:%s',e)
    except requests.HTTPError as e:
        logging.error('HTTP错误:%s,状态码:%d', e, e.response.status_code)
    except requests.ConnectionError as e:
        logging.error('连接错误:%s', e)
if __name__ == '__main__':
    url = "ic.yxdown.com(url)"
    headers = agent_list
    data_list, all_serials_image_info = get_all_serials_image_info(url, headers=headers)
    for data in data_list:
        # print(data)
        get_every_serial_info(data['img_url'], {"User-Agent":choice_agent(agent_list)}, data)
        # 这里把data直接传入 后面直接调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-12 14:55:22 | 显示全部楼层
啊这这 发表于 2024-12-12 14:52
问题有点大啊(自己看法) 不知道有没有来得及 已经尽力赶了 早上10点看见的  帮你修改了一点 现在是可以正 ...

由于我权限不够 所以放不了url的 可以搜(url) 改一下我将前面的(好吧过滤了协议)://..../删掉了其次Avant Browser/1.2.789rel1 (url)也改掉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-12 21:25:58 | 显示全部楼层
啊这这 发表于 2024-12-12 14:52
问题有点大啊(自己看法) 不知道有没有来得及 已经尽力赶了 早上10点看见的  帮你修改了一点 现在是可以正 ...

首先 感谢大佬 当我在公司里面看到这个答案的时候 顿时觉得眼前一亮 在此拜谢

我看了大佬的答案,运行了后 的确达到了我需要的效果,
但是 我也有疑问: 我原本是设想将 :解析url  创建文件夹 下载图片 分别封装成函数 但是 我不知道怎么封装 简单来说 我不知道这几个函数的参数 是怎么用 返回值怎么给下个流程使用
最后 最佳答案就是你了 再次感谢
盼回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-13 14:08:21 | 显示全部楼层
slhlde 发表于 2024-12-12 21:25
首先 感谢大佬 当我在公司里面看到这个答案的时候 顿时觉得眼前一亮 在此拜谢

我看了大佬的答案,运行 ...

先感谢你对我的认可本来担心自己实力不够帮不到你

然后其实说实话我也不知道怎么回复封装这几个函数 我自己用的时候就需要哪个填哪个(和你的代码差不多 而且感觉你的代码可以让我学到挺多其他的只是) 比如解析url的:(访问某个url)参数的话就一般url headers 需要复用时候也基本这两个 return的就html页面信息 (解析页面信息)一般只会要一个页面返回结果 然后进行xpath 等操作 这个一般不会复用 毕竟一个页面对应的基本只会是一种解析 有时候还要换解析器解析(速度或方便找元素) 返回 保存的话单纯就返回字典后期放excel表这种或者下载图片返回图片链接  创建文件夹和下载其实很清晰的知道要什么 文件夹路径 / 图片url 图片保存路径

我的一些拙见 希望可以帮到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 09:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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