bs4多线程解析下载p站每日图片 (Try)

该代码示例展示了如何使用Python编写一个多线程爬虫,从Pixiv的镜像网站vilipix.com抓取并下载图片。程序首先定义了处理文件名和创建目录的函数,然后通过设置参数如日期、类型和页码,获取排行榜页面。使用BeautifulSoup解析HTML,找到图片详情链接,并进一步请求和下载图片。整个过程使用ThreadPoolExecutor实现多线程,提高下载效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**Pixiv镜像地址:**https://www.vilipix.com/

实例

import time
import re
import requests as rs
import os
from concurrent.futures import ThreadPoolExecutor
from bs4 import BeautifulSoup as bs4
import datetime
'''
多线程爬取页面内容步骤
1.如何提取单个页面内容
2.使用多线程进行重复提取

以抓取下载p站图为例
'''

# 文件名称不能包含 \ / : * ? " < > |
def change(str):
    str = str.strip()
    return re.sub(r'[\\/:*?"<>|]','_',str)
def mkdir(path):
    folder = os.path.exists(path)
    if not folder:
        os.makedirs(path)
        print(f"=======创建{path.split('/')[-1]}文件夹成功=======")

    else:
        print(f"======={path.split('/')[-1]}文件已存在=======")


id=1
def scrip_pixiv(date,mode,page,file_src):
    '''
    :param date: 日期 20230511
    :param mode: 类型 daily今日 ,周,月
    :param page: 第几页
    :param file_src:  文件夹路径
    :return:
    '''

    # p站首页
    url_index = 'https://www.vilipix.com'
    url_rank = url_index+'/ranking'
    params = {
        'date' : date,
        'mode' : mode,
        'p':page
    }
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.51'
    }
    resp_rank = rs.get(url_rank,headers=headers,params=params)
    # 请求rank榜成功,爬取rank界面
    if resp_rank.ok:
        bs_rank = bs4(resp_rank.text,'html.parser')
        all_div_illust = bs_rank.findAll('div',class_='illust')
        for illust_div in all_div_illust:
            # 得到a标签中的地址
            a_link = illust_div.a.get('href')
            # 拼接形成详细页面地址
            url_detail = url_index + a_link
            # 请求图片详情地址
            resp_detail = rs.get(url_detail,headers=headers)
            if resp_detail.ok:
                bs_detail = bs4(resp_detail.text,'html.parser')
                # 创建相关图片文件夹
                file_name = change(bs_detail.title.string.split('-')[0])
                sec_src = file_src+'/'+file_name
                try:
                    mkdir(sec_src)
                except:
                    sec_src = file_src+'/异常文件名'+id
                    id+=1
                    mkdir(sec_src)
                ul_illust_pages = bs_detail.find('ul',class_='illust-pages')

                print(f'========开始下载:{file_name}=========')

                # 遍历每一项图片
                for detail_li in ul_illust_pages:
                    # 得到图片的详情地址
                    url_img = detail_li.img.get('src')
                    # 请求并开始下载
                    resp_img = rs.get(url_img,headers=headers)
                    # 根据图片详细地址得到每张图片的名字
                    img_name = re.findall(r"/(\w+\.\w+)\?",url_img)[0]
                    if resp_img.ok:
                        try:
                            with open(sec_src+'/'+img_name,'wb') as f:
                                f.write(resp_img.content)
                                print(f'{img_name}下载成功')
                        except:
                            print('下载失败')
                    resp_img.close()
                print(f'========下载完成:{file_name}=========')
                print()
                # time.sleep(1)
                resp_detail.close()
        resp_rank.close()


if __name__ == '__main__':
    # 昨天20230627
    day = (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime('%Y%m%d')
    file_src = 'C:/Users/wsx/Desktop/animatess_' + day
    # 创建总文件夹
    mkdir(file_src)
    st = time.time()
    all_page = 10
    with ThreadPoolExecutor(10) as executor:
        for page in range(1,all_page+1):
            args=[day,'daily',page,file_src]
            executor.submit(lambda p:scrip_pixiv(*p),args)
    # for page in range(1,4):
    #     scrip_pixiv('20230603','daily',page,file_src)
    ed = time.time()
    print(f'总计耗时为:{ed-st}秒')



### 实现Python多线程网络爬虫 对于构建高效的Web抓取工具,可以利用`concurrent.futures.ThreadPoolExecutor`来管理多个线程并行执行的任务。下面是一个简单的例子展示如何创建一个多线程的网页抓取程序[^1]。 ```python import requests from concurrent import futures from bs4 import BeautifulSoup as Soup def fetch_url_content(url): try: response = requests.get(url) return {'url': url, 'content': response.text} except Exception as e: print(f"Failed fetching {url}: {e}") return None urls_to_scrape = [ "http://example.com", "https://www.python.org/", # Add more URLs here... ] with futures.ThreadPoolExecutor(max_workers=5) as executor: future_to_url = {executor.submit(fetch_url_content, url): url for url in urls_to_scrape} for future in futures.as_completed(future_to_url): data = future.result() if data is not None: soup = Soup(data['content'], features="html.parser") title = soup.title.string.strip() if soup.title else '' print(f"Fetched URL: {data['url']} Title: {title}") ``` 此脚本定义了一个函数`fetch_url_content()`用于获取指定URL的内容,并通过`ThreadPoolExecutor`并发地处理一系列目标网链接。每个请求的结果会被解析成BeautifulSoup对象以便进一步分析页面结构和提取所需数据。 值得注意的是,在实际应用中应当遵循robots.txt协议以及合理设置headers等参数模拟浏览器行为;同时也要注意控制访问频率以免给服务器造成过大压力或违反服务条款[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值