吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3996|回复: 17
收起左侧

[Python 转载] 爬虫之小白的中文写小说爬虫拆解思考

  [复制链接]
txq0211 发表于 2022-4-6 00:34
本帖最后由 txq0211 于 2022-4-6 00:38 编辑

《菜鸟心法》
复杂的问题简单化,
简单的问题标准化,
标准的问题流程化,
流程化迭代程序化,
程序化迭代自动化。

(多多包涵啊,站在小白的角度,先不管反爬和语法标不标准,先用中文用最简洁的代码写出来再说)

一、继续试着用中文写一个小说爬虫
在帖子爬虫之如何引导(忽悠)小白学爬虫的基础上,试着抓抓任意小说的内容。
如果出现乱码,问题,可以尝试用加入一段代码:
响应.encoding = 响应.apparent_encoding
来处理乱码问题。
WX20220405-230337.png
[Python] 纯文本查看 复制代码
import requests

网址 = 'https://www.vipxs.la/8_8698/4392152.html'
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
内容 = 响应.text
print(内容)

好吧,到了这里,就需要一些自学能力了,遇到不懂的,
自己要百度去了解,就像学生时代遇到不懂的翻字典,
作为菜鸟,我也只是想着最简单的方式去理解,用中文来写也是全新的尝试。
parsel库的便捷在于学起来简单,了解一点点CSS知识就能写简单的内容提取了。
WX20220405-231937.png
[Python] 纯文本查看 复制代码
import requests
from parsel import Selector

网址 = 'https://www.vipxs.la/8_8698/4392152.html'
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
页面 = Selector(响应.text)
标题 = 页面.css('.bookname h1::text').get()
内容 = 页面.css('#content::text').getall()
文字 = ''.join(内容)
print(标题,文字)

二、尝试保存内容
跑一跑,不懂的尝试百度,自己主动学习的印象更深
没想到中文可以做到这一步。
WX20220405-233047.png
[Python] 纯文本查看 复制代码
import requests
from parsel import Selector

网址 = 'https://www.vipxs.la/8_8698/4392152.html'
响应 = requests.get(网址)
响应.encoding = 响应.apparent_encoding
页面 = Selector(响应.text)
标题 = 页面.css('.bookname h1::text').get()
内容 = 页面.css('#content::text').getall()
文字 = ''.join(内容)
文件 = f'{标题}.txt'
# a 是追加保存  encoding 保存编码
with open(文件, mode='a', encoding='utf-8') as f:
    f.write(文字)


三、如何简单化
看过很多爬虫,都是代码从上往下一摞的。
如何才能简单理解?
于是,尝试定义一个个函数。可以重复利用的,通过def定义函数,
需要的时候再调用,上述的代码优化分一分累先。
WX20220405-233848.png
继续改造,改造后跑一跑,没问题。

[Python] 纯文本查看 复制代码
import requests
from parsel import Selector

def 请求(网址):
    响应 = requests.get(网址)
    响应.encoding = 响应.apparent_encoding
    return 响应
    
def 获取文本(网址):
    页面 = Selector(请求(网址).text)
    标题 = 页面.css('.bookname h1::text').get()
    内容 = 页面.css('#content::text').getall()
    文字 = ''.join(内容)
    文件 = f'{标题}.txt'
    保存内容(文件,文字)

def 保存内容(文件,文字):
    # a 是追加保存  encoding 保存编码
    with open(文件, mode='a', encoding='utf-8') as f:
        f.write(文字)


网址 = 'https://www.vipxs.la/8_8698/4392152.html'
获取文本(网址)

四、接下来重复上面思路,我们来获取所有的列表
打开目录页,尝试用同样的方式,抓取所以链接。
WX20220405-234459.png
[Python] 纯文本查看 复制代码
import requests
from parsel import Selector

def 请求(网址):
    响应 = requests.get(网址)
    响应.encoding = 响应.apparent_encoding
    return 响应
    
def 获取文本(小说标题,章节链接):
    页面 = Selector(请求(章节链接).text)
    标题 = 页面.css('.bookname h1::text').get()
    内容 = 页面.css('#content::text').getall()
    文字 = ''.join(内容)
    文件 = f'{小说标题}.txt'
    保存内容(文件, 标题, 文字)

def 保存内容(文件, 标题, 文字):
    # a 是追加保存  encoding 保存编码
    with open(文件, mode='a', encoding='utf-8') as f:
        # 写入标题
        f.write(标题)
        # 换行
        f.write('\n')
        # 写入小说内容
        f.write(文字)

def 获取章节(链接):
    列表页 = Selector(请求(链接).text)
    所有链接 = 列表页.css('#list dd a::attr(href)').getall()
    小说标题 = 列表页.css('#info h1::text').get()
    # print(小说标题)
    for 章节链接 in 所有链接:
        章节链接 = 'https://www.vipxs.la%s' % 章节链接
        获取文本(小说标题,章节链接)
        # print(章节链接)

链接 = 'https://www.vipxs.la/8_8698/'
获取章节(链接)

代码到这里就告一段落了,老铁们可以尝试用抄几遍,然后自己改成拼音或者英文试试。
中文最终版,再加个进度条吧。

WX20220406-001153.png
[Python] 纯文本查看 复制代码
import requests
from parsel import Selector
from tqdm import tqdm

def 请求(网址):
    请求头 = {'User-Agent':'Mozilla/5.0 (Macintosh Intel Mac OS X 10.15 rv: 98.0) Gecko/20100101 Firefox/98.0'}
    响应 = requests.get(url=网址,headers=请求头)
    响应.encoding = 响应.apparent_encoding
    return 响应
    
def 获取文本(小说标题,章节链接):
    页面 = Selector(请求(章节链接).text)
    标题 = 页面.css('.bookname h1::text').get()
    内容 = 页面.css('#content::text').getall()
    文字 = ''.join(内容)
    文件 = f'{小说标题}.txt'
    保存内容(文件, 标题, 文字)

def 保存内容(文件, 标题, 文字):
    # a 是追加保存  encoding 保存编码
    with open(文件, mode='a', encoding='utf-8') as f:
        # 写入标题
        f.write(标题)
        # 换行
        f.write('\n')
        # 写入小说内容
        f.write(文字)

def 获取章节(链接):
    列表页 = Selector(请求(链接).text)
    所有链接 = 列表页.css('#list dd a::attr(href)').getall()
    小说标题 = 列表页.css('#info h1::text').get()
    for 章节链接 in tqdm(所有链接[12:]):
        章节链接 = 'https://www.vipxs.la%s' % 章节链接
        获取文本(小说标题,章节链接)

链接 = 'https://www.vipxs.la/8_8698/'
获取章节(链接)



三十几行代码,尤其还是洋不洋土不土的半中文写一个小说爬虫,感觉还是挺简单的。
思考,每一个def函数写一个功能,这样似乎便于理解。
欢迎感兴趣的伙伴们提建议。

免费评分

参与人数 5吾爱币 +10 热心值 +5 收起 理由
jiemou + 1 + 1 我很赞同!
lunker2019 + 1 + 1 谢谢@Thanks!
ll165 + 1 我很赞同!
lcldh + 1 + 1 谢谢分享思路,收藏先
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

 楼主| txq0211 发表于 2022-4-6 09:20
lianquke 发表于 2022-4-6 07:48
挺不错的教程,只是如何兼容更多的网站呢,毕竟标题,正文规则不同

这是有针对性的,要兼容多的网站需要考虑的问题就多了,不同网站是的html结构是不同的
三片叶子的小草 发表于 2022-5-13 17:27
txq0211 发表于 2022-4-6 09:20
这是有针对性的,要兼容多的网站需要考虑的问题就多了,不同网站是的html结构是不同的

写个框架,然后把规则写入json,运行时调用匹配
lanlano 发表于 2022-4-6 00:49
YuanFang0w0 发表于 2022-4-6 07:36
厉害的,现在python对中文支持还是挺好的
怜渠客 发表于 2022-4-6 07:48
挺不错的教程,只是如何兼容更多的网站呢,毕竟标题,正文规则不同
slbcmgn 发表于 2022-4-6 08:49
谢谢楼主分享
无缺i 发表于 2022-4-6 09:15
中文命名是我没想到的
 楼主| txq0211 发表于 2022-4-6 09:17
lanlano 发表于 2022-4-6 00:49
我好像没看到软件下载链接呀。。老大。。

这是编程语言区
photocs 发表于 2022-4-6 09:37
步骤详细,还是中文,明了清晰
金丰龙卫浴 发表于 2022-4-6 09:59
求大佬们 抓包 天天解析怎么注入
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-1 07:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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