jing99 发表于 2024-7-31 22:04

我不是盐神 所有文章打包过程onehu.xyz

本帖最后由 jing99 于 2024-7-31 22:53 编辑

好喜欢Python 尤其是爬虫 尤其是没有反爬手段的网站


上一次分享知乎盐选小说官方爬取路径之后,有佬友@铭焱 指出,我不是盐神 onehu.xyz这个网站能不能爬取?





这就安排!!!!!!!!!!!
先看结果

第一步:读取所有链接并保存下来
这是所有的链接文件,大家不用重复爬啦:https://www.123pan.com/s/cnHcVv-jalgv.html

这一步的目的如题,但是,预防请求太多封ip,于是设置请求一条保存一条,并且记录已经请求第几页了,方面断了之后再续


代码如下:有多线程爬的很快
import requests
from bs4 import BeautifulSoup
import re
from concurrent.futures import ThreadPoolExecutor, as_completed
from collections import OrderedDict

# 基础URL
base_url = 'https://onehu.xyz'

# 获取指定页码的URL
def get_page_url(page_num):
    if page_num == 1:
      return base_url
    else:
      return f'{base_url}/page/{page_num}/#board'

# 提取单个页面中的符合条件的链接
def extract_links_from_page(page_num):
    url = get_page_url(page_num)
    response = requests.get(url)
    response.encoding = 'utf-8'# 设置正确的编码

    soup = BeautifulSoup(response.text, 'html.parser')
    container = soup.select_one('#board > div > div > div')

    if container:
      hrefs = for a in container.find_all('a', href=True)]

      # 筛选符合特定模式的链接
      pattern = re.compile(r'^/2024/\d{2}/\d{2}/.+$')
      filtered_hrefs =

      # 为所有的href添加前缀
      prefixed_hrefs =

      return page_num, prefixed_hrefs
    else:
      return page_num, []

# 保存链接到文件
def save_links_to_file(links, filename='extracted_links.txt'):
    with open(filename, 'w', encoding='utf-8') as file:
      for link in links:
            file.write(link + '\n')

# 遍历所有页码并提取链接
def main():
    total_pages = 281
    all_links = OrderedDict()
    unique_links = set()

    with ThreadPoolExecutor(max_workers=10) as executor:
      future_to_page = {executor.submit(extract_links_from_page, page_num): page_num for page_num in range(1, total_pages + 1)}

      for future in as_completed(future_to_page):
            page_num, links = future.result()
            for link in links:
                if link not in unique_links:
                  unique_links.add(link)
                  if page_num not in all_links:
                        all_links = []
                  all_links.append(link)
            print(f'正在提取第{page_num}个页面,一共提取了{len(unique_links)}个链接')

    # 将所有链接按顺序保存到文件
    save_links_to_file()
    print(f'总共提取了{len(unique_links)}个链接')

if __name__ == '__main__':
    main()





第二步:逐条访问保存的链接,将文本保存为txt以及markdown(回复可查看)
**** Hidden Message *****

最后一步:打包下载!!!
我已经打包好了 ,地址:






最后的最后~~~~~
提醒各位,源码仅仅做学习交流,千万别都去爬取,给网站造成负担,毕竟这个网站公益很多年了,担心跑路,打包文章。


小的还贴心的给各位看官提供了一键爬取功能,所有的代码以及过程输出都放在了谷歌的colab中,这是链接,方便小白也能体验一把爬虫的乐趣~~~(不要乱试哦)
点我直达 谷歌colab文件 一键运行 无需配置


jing99 发表于 2024-7-31 22:44

本帖最后由 jing99 于 2024-7-31 22:46 编辑

SPXJ1234 发表于 2024-7-31 22:42
大佬,这个直接运行报错,第二部分代码读取不到链接保存的文件,这个能错能解决吗还是说必须得本地运行才行 ...
可能是文件地址出错了吧 我修改了一下

import requests
from bs4 import BeautifulSoup
import re
import os
from concurrent.futures import ThreadPoolExecutor, as_completed

# 读取链接
def read_links_from_file(filename='extracted_links.txt'):
    with open(filename, 'r', encoding='utf-8') as file:
      links =
    return links

将filename='extracted_links.txt'引号里面的文件以及路径改成上一步保存的文件,就肯定没问题

baliao 发表于 2024-8-1 09:07

感谢大佬的分享! 能够分享下像试卷/试题网这样的怎么爬和写入到word里面.
题目不是图片的那种,尤其是数学, 涉及到开方/平方/分式等的如何写入到word里面
例如这种: http://www.jyeoo.com/ 谢谢!

最新的 发表于 2024-7-31 22:09

爬虫的乐趣!

baicai223 发表于 2024-7-31 22:11

谢谢楼主分享

kangta520 发表于 2024-7-31 22:12

谢谢分享,爬虫YYDS

42328669425 发表于 2024-7-31 22:17

感谢分享{:301_992:}

yfd52 发表于 2024-7-31 22:25

思路很好,学习了。

Healer-zx 发表于 2024-7-31 22:28

不但有优质的网站,竟然还有代码学习,刚好拿来学习一下

fengyijiuchui 发表于 2024-7-31 22:30

感谢分享

ziyezy 发表于 2024-7-31 22:30

感谢分享{:301_993:}

SPXJ1234 发表于 2024-7-31 22:32

大佬牛B,感谢分享~
页: [1] 2 3 4 5 6 7
查看完整版本: 我不是盐神 所有文章打包过程onehu.xyz