吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2730|回复: 38
收起左侧

[Python 原创] python初学者的第一个爬虫

[复制链接]
weihaozang 发表于 2024-3-24 17:36
比较喜欢逛github学习python,看到一个在线的文档,就想着能不能爬一下。用了两个小时的尝试,终于完成了。主要思路是:获取页面源代码,将页面里面的ascii码转为中文,然后将html转换成md格式,并写入文件中。
[Python] 纯文本查看 复制代码
# encoding=utf-8
import re
import time
import html2text
import requests
from bs4 import BeautifulSoup
import threading


# 将ascii转化为中文字符
def ascii_to_str(text) -> str:
    obj = re.compile(r"&#x(?P<asc>.*?);", re.S)
    ret = obj.finditer(resp.text)
    new_text = resp.text
    for i in ret:
        as_code = i.group("asc")
        find_sr = r"&#x" + as_code + r";"
        string_int = int(as_code, 16)
        new_text = new_text.replace(find_sr, chr(string_int))
    return new_text


# 写入md文件中
def html_to_md(text, filename) -> None:
    with open(filename, 'w', encoding="utf-8") as file:
        h = html2text.HTML2Text()
        content = h.handle(text)
        file.write(content)


# 处理每个章节页面
def one_page_deal(url_name, header, file_name) -> None:
    resp1 = requests.get(url_name, headers=header)
    bs = BeautifulSoup(resp1.text, "html.parser")
    # 过滤掉目录
    ret1 = bs.find_all("ul", attrs={"class": "summary"})
    for i_index in ret1:
        i_index.decompose()
    # 过滤掉多余的字符
    ret2 = bs.find_all("div", attrs={"class": "search-results"})
    for j in ret2:
        j.decompose()
    html_to_md(str(bs), file_name)


url = "https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/"
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 "
                  "Safari/537.36 Edg/122.0.0.0"

}

resp = requests.get(url, headers=header)
# 找title作为文件的名字
page = BeautifulSoup(resp.text, "html.parser")
title_name = page.find("title")
file_name = title_name.text.replace(" ", "_") + ".md"
new_string = ascii_to_str(resp.text)
html_to_md(new_string, file_name)
# 找出每个章节的页面地址
chapter = []
ret = page.find_all("li", attrs={"class": "chapter"})
index = 0
for i in ret:
    if index == 0:
        index += 1
        continue
    url_name = url + i.get("data-path")
    chapter.append(url_name)
# 多线程操作
threads = []
for i in chapter:
    file_name = str(index) + ".md"
    t = threading.Thread(target=one_page_deal, args=(i, header, file_name))
    t.start()
    threads.append(t)
    index += 1
    time.sleep(1)

for i in threads:
    i.join()

运行结果

运行结果

免费评分

参与人数 5吾爱币 +11 热心值 +5 收起 理由
jackeyxiang + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
ruanxiaoqi + 1 + 1 我很赞同!
feiyuvip + 1 + 1 热心回复!
xhf34242 + 1 + 1 热心回复!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

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

Forward 发表于 2024-3-24 21:36
WvRt 发表于 2024-3-24 18:58
卧槽大佬学多久了,我学了两个月还不会爬

跟着B站上面的视频一边学以便敲代码,自己来做项目,一个月你到达的地步都不止楼主这点的,加油
mytomsummer 发表于 2024-4-1 20:41
Goldenrich 发表于 2024-3-24 21:08
&#x    这几个字符是什么意思,求解?

文心一言:这段代码是在Python中创建一个正则表达式模式,用于查找特定的字符串。
find_sr = r"&#x" + as_code + r";"
这里:
r 前缀表示这是一个原始字符串,这样Python就不会对反斜杠 \ 进行特殊处理。
&#x 和 ; 是HTML实体的一部分,通常用于表示特殊字符或Unicode字符。
as_code 是一个变量,它应该包含某个字符的Unicode十六进制编码。
整个正则表达式 find_sr 的目的是找到形如 &#xXXXX; 的HTML实体,其中 XXXX 是由 as_code 变量提供的十六进制编码。
WvRt 发表于 2024-3-24 18:58
saoye30 发表于 2024-3-24 19:30
感谢楼主
 楼主| weihaozang 发表于 2024-3-24 20:06
WvRt 发表于 2024-3-24 18:58
卧槽大佬学多久了,我学了两个月还不会爬

我这爬的应该是最基础的,高级的我也不会。你可以在b站上找个爬虫的视频看看,一定要自己动手写代码,不会的就谷歌。
sai609 发表于 2024-3-24 20:34
得先打好基础在实操
loveyao6688 发表于 2024-3-24 20:52
厉害,也想学,怕学不会。
Mr.救赎 发表于 2024-3-24 21:26
要想学高级还得逆向分析和js
Hangjau 发表于 2024-3-24 21:38
WvRt 发表于 2024-3-24 18:58
卧槽大佬学多久了,我学了两个月还不会爬

两个月?我觉得有人带1小时都不要
booluo 发表于 2024-3-24 21:56
贴吧之类的可以练练手
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-11 19:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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