Python之起点中文网爬虫

Python之起点中文网爬虫

注:请勿用于其他用途,仅供学习使用

import requests
import re
import os
from lxml import etree

head = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/78.0.3904.97 Safari/537.36"}


def get_page(book_id):
    """获取章节字段"""
    # 所有章节接口https:https://book.qidian.com/ajax/book/category?bookId=1013414929
    b_url = 'https://book.qidian.com/ajax/book/category?bookId='
    # 获取文章内容https://read.qidian.com/chapter/9KwLON5H3DQKgXB091LLaA2/EftiSjrby1j6ItTi_ILQ7A2
    b_p_url = 'https://read.qidian.com/chapter/'
    # 小说名//*[@id="j_textWrap"]/div/div/h1
    # 章节名//div//h3/span/text()[1]
    # 内容//div//p/span/text()
    url = b_url + book_id
    try:
        r = requests.get(url, headers=head)
        r.raise_for_status()
        r.encoding = 'utf-8'
        print('获取完成!。。。')
        # 章节详细页
        page_list = re.findall(r'{"uuid":\d+,"cN":".+?","uT":".+?","cnt":\d+,"cU":"(.+?)","id":\d+,"sS":\d}', r.text)
        # 创建小说文件夹
        n_url = 'https://book.qidian.com/info/' + book_id
        r1 = requests.get(n_url, headers=head)
        r1.raise_for_status()
        r1.encoding = 'utf-8'
        novel_name = etree.HTML(r1.text).xpath('/html/body/div/div[6]/div[1]/div[2]/h1/em/text()')[0]
        os.mkdir('./%s' % novel_name)
        # d_url = b_p_url + page_list[0]
        # r2 = requests.get(d_url, headers=head)
        # r2.encoding = 'utf-8'
        # ttt = etree.HTML(r2.text).xpath('//div//h3/span/text()[1]')[1]
        # j = '\n'
        # content = j.join(ttt)
        # print(content)
        # print(ttt)
        for each in page_list:
            d_url = b_p_url + each
            try:
                r2 = requests.get(d_url, header=head)
                r2.raise_for_status()
                r2.encoding = 'utf-8'
                # 内容
                ttt = etree.HTML(r2.text).xpath('//div[@class="read-content j_readContent"]/p/text()')
                j = '\n'
                content = j.join(ttt)
                # 章节名
                p_name = etree.HTML(r2.text).xpath('//div//h3/span/text()[1]')[1]
                # 写入文件
                with open('./%s/%s.txt' % (novel_name, p_name), 'w') as f:
                    f.write(content)
                    print("finish")
            except Exception as results:
                print(results)
    except Exception as result:
        print(result)


def main():
    # u = input('将起点中文网小说主页链接粘贴此处(请以+结尾):')
    u = 'https:https://book.qidian.com/ajax/book/category?bookId=1013414929'
    # 匹配出小说id:https://book.qidian.com/info/1013414929#catlog来得到bookid
    b_id = re.findall(r'(\d+)', u)[0]
    get_page(b_id)


if __name__ == '__main__':
    main()

是的,未经许可,禁止转载!

### 使用 Python 编写爬虫抓取起点中文网 VIP 内容的方法 #### 法律声明与道德准则 在开发任何类型的网络爬虫之前,务必阅读并遵守目标网站的服务条款。许多在线平台明令禁止未经授权的数据抓取行为。对于付费内容或需登录才能访问的内容,更应谨慎行事。 #### 准备工作 要实现这一功能,通常需要以下几个库的支持: - `requests` 或 `httpx`: 用于发起 HTTP 请求。 - `BeautifulSoup4` (bs4): 解析 HTML 文档结构。 - `lxml`: 提供高效的 XML/HTML 解析器给 BeautifulSoup。 - `re`: 处理正则表达式匹配操作。 - `pandas`: 如果涉及大量数据整理可选用此工具[^1]。 由于起点中文网的 VIP 部分受保护措施影响较大,简单的 GET 请求可能无法直接获得所需信息。因此,在尝试构建此类应用前,建议先了解该站点的具体防护策略以及合法获取方式。 #### 登录模拟 针对需要身份验证的情况,可以通过以下方法进行会话保持和自动登录: ```python import requests login_url = 'https://passport.qidian.com/login' target_page = 'https://book.qidian.com/vip' session = requests.Session() response = session.get(login_url) # 假设这里已经完成了验证码识别或其他必要的交互过程 data = { "username": "your_username", "password": "your_password" } headers = {'User-Agent': 'Mozilla/5.0'} post_response = session.post(target_page, data=data, headers=headers) print(post_response.text[:200]) # 输出部分响应体查看是否成功跳转到目标页面 ``` 请注意上述代码仅为示意用途,实际执行时还需考虑更多细节如 Cookie 管理、CSRF Token 获取等问题。 #### 数据提取逻辑 一旦获得了有效的已认证 Session 对象,则可以继续向特定章节链接发送请求,并从中抽取正文部分内容。这一步骤往往涉及到复杂的 DOM 结构解析及 CSS Selectors 的运用。 ```python from bs4 import BeautifulSoup chapter_url = 'example_chapter_link' # 替换成真实的章节地址 res = session.get(chapter_url) soup = BeautifulSoup(res.content, 'html.parser') content_div = soup.find('div', class_='read-content') # 查找包含小说文本的实际 div 标签 formatted_text = content_div.get_text(strip=True).replace('\u3000', '') # 清除多余空白字符 print(formatted_text) ``` 以上片段展示了如何定位至含有书籍内容的关键节点,并对其进行初步清理以便后续使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值