您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python爬取免费或付费小说的示例分析
## 引言
在数字阅读时代,网络小说资源呈现爆发式增长。本文将通过Python技术手段,分析如何爬取免费和付费小说内容,涵盖基础爬虫实现、反爬策略应对、付费内容获取思路等关键技术点。所有示例代码将遵循Robots协议和版权规范,仅用于技术学习目的。
## 一、基础环境准备
### 1.1 所需工具库
```python
# 核心依赖库
import requests # 网络请求
from bs4 import BeautifulSoup # HTML解析
import re # 正则表达式
import json # JSON处理
from urllib.parse import urljoin # URL拼接
# 可选扩展库
import selenium # 动态页面渲染
import scrapy # 爬虫框架
import pandas as pd # 数据存储
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.example.com',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
以笔趣阁类网站为例的完整流程:
def get_free_novel(url):
try:
response = requests.get(url, headers=headers, timeout=10)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 提取章节列表
chapters = []
for item in soup.select('.chapter-list a'):
chapter_url = urljoin(url, item['href'])
chapters.append({
'title': item.text.strip(),
'url': chapter_url
})
# 逐章抓取内容
contents = []
for chap in chapters[:5]: # 示例仅抓取前5章
chap_res = requests.get(chap['url'], headers=headers)
chap_soup = BeautifulSoup(chap_res.text, 'html.parser')
content = chap_soup.select_one('.content').text
contents.append({
'title': chap['title'],
'content': re.sub(r'\s+', '\n', content.strip())
})
time.sleep(1) # 礼貌性延迟
return pd.DataFrame(contents)
except Exception as e:
print(f"抓取失败: {str(e)}")
当遇到JavaScript渲染页面时,需使用Selenium:
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
def dynamic_crawler(url):
opts = Options()
opts.add_argument('--headless') # 无头模式
driver = Chrome(options=opts)
try:
driver.get(url)
# 等待章节列表加载
chapters = driver.find_elements_by_css_selector('.chapter-item')
result = []
for chap in chapters[:3]:
chap.click()
time.sleep(1) # 等待内容加载
content = driver.find_element_by_id('content').text
result.append({
'title': chap.text,
'content': content
})
return result
finally:
driver.quit()
以起点中文网为例的登录模拟:
session = requests.Session()
login_data = {
'username': 'your_username',
'password': 'your_password',
'remember': 'on'
}
def qidian_login():
# 先获取必要token
login_page = session.get('https://login.qidian.com', headers=headers)
token = re.search(r'name="_csrfToken" value="(.*?)"', login_page.text).group(1)
login_data['_csrfToken'] = token
# 提交登录请求
session.post('https://login.qidian.com', data=login_data, headers=headers)
# 验证登录状态
profile = session.get('https://my.qidian.com', headers=headers)
if '用户中心' in profile.text:
print("登录成功")
else:
print("登录失败")
def unlock_chapter(chapter_id):
# 获取购买token
token_url = f'https://vipreader.qidian.com/ajax/getChapterToken?chapterId={chapter_id}'
token_data = session.get(token_url).json()
# 构造购买请求
buy_url = 'https://vipreader.qidian.com/ajax/buyChapter'
payload = {
'chapterId': chapter_id,
'csrfToken': token_data['data']['csrfToken']
}
result = session.post(buy_url, data=payload).json()
if result['code'] == 0:
print(f"章节{chapter_id}解锁成功")
return True
else:
print(f"解锁失败: {result['msg']}")
return False
反爬类型 | 解决方案 | 实现示例 |
---|---|---|
IP限制 | 代理IP池 | requests.get(url, proxies={'http': 'ip:port'}) |
验证码 | OCR识别/打码平台 | 使用ddddocr库自动识别 |
行为检测 | 随机延迟 | time.sleep(random.uniform(0.5, 2)) |
数据加密 | 逆向分析 | 分析JavaScript解密逻辑 |
import random
def advanced_request(url):
# 动态User-Agent
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'
]
headers = {
'User-Agent': random.choice(user_agents),
'X-Forwarded-For': f'{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}.{random.randint(1,255)}'
}
# 随机延迟
time.sleep(random.uniform(1, 3))
return requests.get(url, headers=headers)
import sqlite3
def save_to_db(data):
conn = sqlite3.connect('novels.db')
c = conn.cursor()
# 创建表
c.execute('''CREATE TABLE IF NOT EXISTS chapters
(id INTEGER PRIMARY KEY,
title TEXT,
content TEXT,
book_id INTEGER)''')
# 批量插入
c.executemany('INSERT INTO chapters VALUES (?,?,?,?)', data)
conn.commit()
conn.close()
def clean_text(text):
# 去除广告内容
text = re.sub(r'请收藏.*?网址', '', text)
# 规范化换行
text = re.sub(r'[\r\n]+', '\n', text)
# 去除特殊字符
text = re.sub(r'[^\w\s\u4e00-\u9fa5。,!?、]', '', text)
return text.strip()
本文通过具体案例演示了Python小说爬取的技术实现,但需要特别强调: - 免费资源爬取应控制频率,避免影响网站运营 - 付费内容获取必须获得合法授权 - 建议优先使用正版API接口(如微信读书开放平台)
技术应当用于推动行业发展而非破坏市场秩序,请读者务必遵守法律法规,合理使用爬虫技术。
# 示例调用代码
if __name__ == '__main__':
free_url = 'http://www.biquge.com/book/1/'
df = get_free_novel(free_url)
print(df.head())
注意:本文所有代码示例均为教学演示,实际应用请遵守相关网站的使用条款和法律法规。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。