吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1339|回复: 21
收起左侧

[Python 原创] 某题库的小小Python爬虫

  [复制链接]
铁板兄长361 发表于 2024-2-28 13:30
本帖最后由 铁板兄长361 于 2024-2-28 20:45 编辑

本人在学习阶段写的一个小小爬虫,还有很多功能没有完善,希望各位前辈指点一二。
目标网站:aHR0cHMlM0EvL3d3dy5qaHE4LmNuLw==

首页.png
首先打开目标网站分析网页源码,查找网站换页规律,很简单的得知换页规律,这里仅分析网页
1709094410313.png

得知了网站题目的换页规律,(目标站点没有做防护)轻点撸)~。
那么手写一个小虫子 启动即可!!!


[Python] 纯文本查看 复制代码
import queue
import requests
import time
from lxml import etree
import threading
import pymysql
from queue import Queue

# 数据库连接配置
db_config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '123456',
    'database': '题库',
    'charset': 'utf8'
}

# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}

# 重试次数
max_retries = 5

# 线程数量
num_threads = 3

# 开始爬取的页面
start_page = 1  # 指定从第10000个页面开始

# 爬取并插入数据库的函数
def crawl_and_insert(thread_id, url_queue, db_pool, start_page):
    while True:
        try:
            page_number = start_page + url_queue.get(timeout=1)  # 获取页面编号,设置超时时间
        except queue.Empty:
            break  # 队列为空时退出循环

        url = f'aHR0cHMlM0EvL3d3dy5qaHE4LmNuLw==daan/tiku/0/{page_number}.html'
        retries = 0

        # 建立数据库连接
        db = db_pool.get()
        cursor = db.cursor()

        # 检查 URL 是否已被爬取
        cursor.execute("SELECT COUNT(*) FROM crawled_urls WHERE url = %s", (url,))
        if cursor.fetchone()[0] > 0:
            print(f"线程-{thread_id}: URL 已爬取 {url}")
            db_pool.put(db)  # 将连接放回连接池
            continue  # 如果已爬取,跳过此URL

        # 重试机制
        while retries < max_retries:
            try:
                res = requests.get(url, headers=headers, timeout=10)
                content = res.content.decode('GB2312', 'ignore')
                tree = etree.HTML(content)
                links = tree.xpath("/html/body/div[1]/div/div/div[4]/div/div[1]/div/ul/li/a/@href")

                for link in links:
                    # 获取所有超链接的完整 URL
                    full_url = 'https://www.jhq8.cn/' + link

                    # 检查链接是否已被爬取
                    cursor.execute("SELECT COUNT(*) FROM crawled_urls WHERE url = %s", (full_url,))
                    if cursor.fetchone()[0] > 0:
                        print(f"线程-{thread_id}: URL 已爬取 {full_url}")
                        continue

                    response = requests.get(full_url, headers=headers)
                    page_content = response.content.decode('GB2312', 'ignore')
                    tree = etree.HTML(page_content)
                    text_list = tree.xpath("/html/body/div[1]/div/div/div[3]/div/div/div[1]/div[2]/p//text()")
                    formatted_text = ' '.join(text_list)
                    cleaned_text = formatted_text.replace("\n", "").replace("\r", "").replace("\t", "").replace(' ', '')

                    # 操作 MySQL 数据库的语句
                    try:
                        # 插入数据
                        sql = "INSERT INTO tiku (题目) VALUES (%s)"
                        cursor.execute(sql, (cleaned_text,))
                        db.commit()

                        # 将爬取的 URL 存储到数据库中
                        cursor.execute("INSERT INTO crawled_urls (url) VALUES (%s)", (full_url,))
                        db.commit()
                    except pymysql.MySQLError as e:
                        print(f"线程-{thread_id}: 数据库错误 {e}")
                        db.rollback()

                db_pool.put(db)  # 将连接放回连接池
                break  # 成功爬取,跳出重试循环
            except requests.RequestException as e:
                retries += 1
                print(f"线程-{thread_id}: 请求 URL 失败,正在重试... {e}")

# 记录开始时间
start_time = time.time()

# 创建URL队列
url_queue = Queue()

# 向队列中添加URL
for i in range(58387 - start_page):  # 从指定页面开始爬取
    url_queue.put(i)

# 创建数据库连接池
db_pool = Queue(maxsize=num_threads)
for _ in range(num_threads):
    db = pymysql.connect(**db_config)
    db_pool.put(db)

# 创建并启动线程
threads = []
for i in range(num_threads):
    thread = threading.Thread(target=crawl_and_insert, args=(i, url_queue, db_pool, start_page))
    thread.start()
    threads.append(thread)

# 等待所有线程完成
for thread in threads:
    thread.join()

# 记录结束时间
end_time = time.time()

# 计算程序运行时间
elapsed_time = end_time - start_time
print(f"所有线程都已完成。总运行时间:{elapsed_time:.2f} 秒")
1709097247065.png
域名分析.png

免费评分

参与人数 6吾爱币 +12 热心值 +5 收起 理由
jacky4147 + 1 + 1 我很赞同!
T4DNA + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
GloryNotes + 1 我很赞同!
玄冰草 + 1 + 1 我很赞同!
cfx0619 + 1 + 1 谢谢@Thanks!
爱飞的猫 + 7 + 1 不错哦,用上了多线程和数据库储存信息。

查看全部评分

本帖被以下淘专辑推荐:

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

tianya0908 发表于 2024-2-29 11:43
学习了,谢谢分享
milu1123 发表于 2024-2-29 13:06
bx05 发表于 2024-2-29 23:05
HHZC 发表于 2024-3-1 09:17
谢谢分享,学习一下!
JustSoso523 发表于 2024-3-1 15:25
不错不错 学习了
chenshiforever 发表于 2024-3-3 14:46
封ip,而且这个题量不是很大
玄冰草 发表于 2024-3-3 16:01
不错不错 学习了
luxingyu329 发表于 2024-3-3 16:04
有好我没有用过的知识点,已经忘记了怎么办
玄冰草 发表于 2024-3-3 16:06
milu1123 发表于 2024-2-29 13:06
打码不够彻底,网站已被我玩坏。。。

没看出来是哪个网站?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-5-1 04:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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