吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2967|回复: 18
收起左侧

[Python 原创] 【爬虫】爬取CCHO历年试卷及解析

[复制链接]
icer233 发表于 2024-9-17 15:43
目标网站:https://ccho.eduzhixin.com/archives/tag/csst
网站总共有3页:https://ccho.eduzhixin.com/archives/tag/csst/page/1
问题:个别详情页面结构不同,大部分的答案是pdf,个别的是图片或者没有,我直接跳过了,程序会提示哪个页面不行,需要手动处理
源码如下
[Python] 纯文本查看 复制代码
# -*- coding:utf-8 -*-
import requests
from lxml import etree
import os
from multiprocessing.dummy import Pool

# 创建储存目录
if not os.path.exists('./ccho'):
    os.makedirs('./ccho')

url = 'https://ccho.eduzhixin.com/archives/tag/csst/page/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0'
}

for i in range(1,4):
    # 创建文件目录实例
    purl = url + str(i)
    response = requests.get(url=purl, headers=headers).text
    tree = etree.HTML(response)
    # 解析div列表
    div_list = tree.xpath('/html/body/div[1]/div[4]/div/div/div[1]/div')
    def down(div):
        detail_url = div.xpath('./article/a[1]/@href')[0] # 获取详情页链接
        name = div.xpath('./article/a[1]/@title')[0]  # 获取文件名
        ans_path = './ccho/' + name +'.pdf' # 生成文件路径
        detail_page = requests.get(url=detail_url, headers=headers).text
        detail_tree = etree.HTML(detail_page)
        try:
            down_url = detail_tree.xpath('//div[@class="row"]/div/article/div/div/div//strong/a/@href')[0]
            data = requests.get(url=down_url, headers=headers).content
            with open(ans_path, 'wb') as fp:
                fp.write(data)
            print(name, 'is downloaded')
        except:
            print('Unable to download', name, ' , url:', detail_url)
    pool = Pool(5)
    pool.map(down, div_list)
    pool.close()
    pool.join()



欢迎大家指正错误

免费评分

参与人数 3吾爱币 +7 热心值 +3 收起 理由
qiaoyong + 1 + 1 热心回复!
restart19 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

weixinzr99968 发表于 2024-9-24 17:56
# -*- coding:utf-8 -*-
import requests
from lxml import etree
import os
import re
from multiprocessing.dummy import Pool

# 创建储存目录
if not os.path.exists('./ccho'):
    os.makedirs('./ccho')

url = 'https://ccho.eduzhixin.com/archives/tag/csst/page/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0'
}

def down(div):
    try:
        detail_url = div.xpath('./article/a[1]/@href')[0]  # 获取详情页链接
        name = div.xpath('./article/a[1]/@title')[0]  # 获取文件名
        name = re.sub(r'[\/:*?"<>|]', '-', name)  # 替换掉非法字符
        ans_path = './ccho/' + name + '.pdf'  # 生成文件路径
        
        detail_page = requests.get(url=detail_url, headers=headers).text
        detail_tree = etree.HTML(detail_page)
        
        down_url = detail_tree.xpath('//div[@class="row"]/div/article/div/div/div//strong/a/@href')
        if down_url:
            down_url = down_url[0]
        else:
            print(f'No download link found for {name}, url: {detail_url}')
            return
        
        data = requests.get(url=down_url, headers=headers).content
        with open(ans_path, 'wb') as fp:
            fp.write(data)
        print(name, 'is downloaded')
   
    except Exception as e:
        print(f'Error downloading {name}, url: {detail_url}, error: {e}')

for i in range(1, 4):
    # 拼接页面 URL
    purl = url + str(i)
    try:
        response = requests.get(url=purl, headers=headers)
        response.raise_for_status()  # 检查请求是否成功
        response_text = response.text
    except requests.exceptions.RequestException as e:
        print(f"Error fetching page {purl}: {e}")
        continue

    tree = etree.HTML(response_text)
   
    # 解析 div 列表
    div_list = tree.xpath('/html/body/div[1]/div[4]/div/div/div[1]/div')
   
    # 使用多线程池并发下载
    pool = Pool(5)
    pool.map(down, div_list)
    pool.close()
    pool.join()
weixinzr99968 发表于 2024-9-24 17:58
weixinzr99968 发表于 2024-9-24 17:56
# -*- coding:utf-8 -*-
import requests
from lxml import etree


        1.        修复了 url 拼接错误,确保循环时请求正确的页面。
        2.        添加了非法字符过滤,确保文件名不会因为非法字符而报错。
        3.        提取下载链接时增加了检查,避免 IndexError。
        4.        为 requests.get() 添加了异常处理,避免程序崩溃。
        5.        在多线程下载中改进了错误处理和日志输出。
 楼主| icer233 发表于 2024-9-18 17:50
爬虫思路见https://www.52pojie.cn/thread-1957905-1-1.html
baihedengge 发表于 2024-9-18 09:42
学习了,真厉害。
woshizhj0451 发表于 2024-9-18 10:38
本来是想学习下爬虫编程的,结果发现这个网站是真不错,在上面答了一会儿题
头像被屏蔽
nxyclf 发表于 2024-9-18 11:25
提示: 作者被禁止或删除 内容自动屏蔽
msmvc 发表于 2024-9-18 11:30
虽然试题都作不出来,但是我看透了本质:如果我掌握了X,我就会作Y
W8826 发表于 2024-9-18 13:49
完蛋  看不懂啊  小白一个
Stars666 发表于 2024-9-18 17:45
感谢大佬分享
aiguohou 发表于 2024-9-18 19:35
感谢分享
xiaoyiyongji 发表于 2024-9-18 20:12
爬虫技术天下无敌!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-17 18:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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