weihaozang 发表于 2024-3-24 17:36

python初学者的第一个爬虫

比较喜欢逛github学习python,看到一个在线的文档,就想着能不能爬一下。用了两个小时的尝试,终于完成了。主要思路是:获取页面源代码,将页面里面的ascii码转为中文,然后将html转换成md格式,并写入文件中。# 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()

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

卧槽大佬学多久了,我学了两个月还不会爬{:1_911:}

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

贴吧之类的可以练练手
页: [1] 2 3 4
查看完整版本: python初学者的第一个爬虫