爬去起点中文网小说

爬取《起点》中文网 免费小说

前言: 第一次写这么复杂的程序,欢迎各位大佬批评指正。。

  1. 去分析《起点》中文网的响应数据 (https://www.qidian.com/free/all)
    第一步,检查网页的response响应,通过打开NETwork发现起点中文网的有Referer反爬,
    在这里插入图片描述
    2.通过调试和分析数据 发现我们要的数据是嵌套在html里面的,我们利用xpath提取出我们想的每一部小说的url 和名字

在这里插入图片描述
在这里插入图片描述
3.我们拿到了 每一页中的所有的小说url 下一步就是提取小说的入口 通过分析得知 小说的入口也是嵌套html里面的
在这里插入图片描述
4.分析小说文本的数据
在这里插入图片描述

import requests
from lxml import etree
from fake_useragent import FakeUserAgent

if name == ‘main’:
for i in range(int(input(‘输入爬取的页说(一页是二十本小说)>>>>>>:’))):
# 确定目标的url——
url_ = f’https://www.qidian.com/free/all?orderId=&vip=hidden&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=1&page={i + 1}’
# 构造身user身份
user = FakeUserAgent().random
headers_ = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36’,
‘Cooie’: ‘e1=%7B%22pid%22%3A%22qd_P_free%22%2C%22eid%22%3A%22qd_C44%22%7D; e2=%7B%22pid%22%3A%22qd_P_free%22%2C%22eid%22%3A%22qd_C44%22%7D; csrfToken=Bf8rW9wM2hTvLVvBKEeorxq58HVuMaROuzWo9N2E; newstatisticUUID=1610114709_606719731; yep_uuid=325a69ff-672a-68c2-ed48-6e113af5cb65; qdrs=0%7C3%7C0%7C0%7C1; showSectionCommentGuide=1; qdgd=1; e1=%7B%22pid%22%3A%22qd_P_limitfree%22%2C%22eid%22%3A%22qd_E01%22%2C%22l1%22%3A4%7D; e2=%7B%22pid%22%3A%22qd_P_limitfree%22%2C%22eid%22%3A%22qd_A18%22%2C%22l1%22%3A3%7D; bc=1021516016%2C1017918245%2C1025325411%2C1024892080; lrbc=1025325411%7C625665811%7C0%2C1024892080%7C613857996%7C0%2C1021516016%7C630782911%7C1; rcr=1025325411%2C1024892080%2C1017918245%2C1021516016’,
‘Referer’: ‘https://book.qidian.com/’
}
# 发送请求得到响应
res
= requests.get(url
, headers=headers_).text
data_ = etree.HTML(res_)
# 提取每一本小说对应的url
url_list = data_.xpath(’//div[@class=“book-mid-info”]/h4/a/@href’)
a = []
for k in url_list:
j = ‘http:’ + k
a.append(j)

    b = []
    for p in a:
        res_1 = requests.get(url=p, headers=headers_).text
        data = etree.HTML(res_1)
        name1 = 'http:' + data.xpath('//div[@class="book-img"]/a/@href')[0]
        b.append(name1)
    print(b)
    # 给每一本对应的小说的url 发送请求 然后一次下载小说
    for l_3 in b:
       
        # 发送网络请求
        response_ = requests.get(url=l_3, headers=headers_).text
        # print(response_)
        # 转换xpath格式 提取数据
        data_1 = etree.HTML(response_)
        # 小说《名字》
        name_ = data_1.xpath('//div[@class="crumbs-nav"]/a[@class="act"]/text()')[0]
        print(name_)
        # 对应章节标题
        res_1 = data_1.xpath('//h3/span[@class="content-wrap"]/text()')[0]
        # print(res_)
        # 提取小说内容
        res_data = '\n'.join(data_1.xpath('//div[@class="read-content j_readContent"]/p/text()'))
        # print(res_data)
        # 提取下一章的url
        url_list1 = 'http:' + data_1.xpath('//div[@class="text-wrap"]/@data-nurl')[0]
        print(url_list1)
        with open(f'{name_}.txt', 'a', encoding='utf-8')as f:
            f.write(f'{res_1}\n')
            f.write(res_data)
            print(f'[{name_}]章节>>>【{res_1}】下载完毕')
        try:
            #  同过提取下一章的url 把它放在一个死循环里。依次写入
            while True:
                res_2 = requests.get(url=url_list1, headers=headers_).text

                # 文章标题
                res_two = etree.HTML(res_2)
                res_hea = res_two.xpath('//h3/span[@class="content-wrap"]/text()')[0]
                # 文 章内容

                res_two_data = '\n'.join(res_two.xpath('//div[@class="read-content j_readContent"]/p/text()'))
                #  判断文章的内容是否为空  如果为空的话就结束死循环
                if not res_two_data:
                    break
                # 下一章的url_会依次传入到73的get请求  来到达循环下载
                url_list1 = 'https:' + res_two.xpath('//div[@class="text-wrap"]/@data-nurl')[0]
                f = open(f'{name_}.txt', 'a', encoding='utf-8')
                f.write(f'{res_hea}\n')
                f.write(f'{res_two_data}')
                print(f'[{name_}]章节[{res_hea}]下载完毕')
        except:
            print(f'{name_}所有章节下载完成>>>>>>>>>>>>!!!!!')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python编写的爬取起点小说网的多线程虫代码: ```python import requests from lxml import etree from queue import Queue import threading # 定义虫类 class Spider(): def __init__(self, url, headers): self.url = url self.headers = headers self.session = requests.Session() self.session.headers.update(headers) # 获取小说列表 def get_novel_list(self): response = self.session.get(self.url) html = etree.HTML(response.text) novel_list = html.xpath('//div[@class="book-mid-info"]/h4/a/@href') return novel_list # 获取小说信息 def get_novel_info(self, novel_url): response = self.session.get(novel_url) html = etree.HTML(response.text) novel_info = {} novel_info['title'] = html.xpath('//div[@class="book-info "]/div[@class="book-info "]/h1/em/text()')[0] novel_info['author'] = html.xpath('//div[@class="book-info "]/div[@class="book-info "]/h1/span/a/text()')[0] novel_info['intro'] = html.xpath('//div[@class="book-intro"]/p/text()')[0] novel_info['word_count'] = html.xpath('//div[@class="book-info "]/div[@class="book-info "]/p/span[1]/text()')[0] return novel_info # 定义爬取线程类 class SpiderThread(threading.Thread): def __init__(self, spider, novel_queue): threading.Thread.__init__(self) self.spider = spider self.novel_queue = novel_queue def run(self): while True: try: novel_url = self.novel_queue.get(False) novel_info = self.spider.get_novel_info(novel_url) print(novel_info) except: break # 定义主函数 def main(): url = 'https://www.qidian.com/all' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} spider = Spider(url, headers) novel_list = spider.get_novel_list() # 创建小说队列 novel_queue = Queue() # 将小说列表加入队列 for novel_url in novel_list: novel_queue.put(novel_url) # 创建爬取线程 threads = [] for i in range(5): spider_thread = SpiderThread(spider, novel_queue) spider_thread.start() threads.append(spider_thread) # 等待所有线程结束 for t in threads: t.join() if __name__ == '__main__': main() ``` 该代码使用了Python的requests库和lxml库来进行网页爬取和解析,使用了多线程来提高爬取效率。首先定义了一个Spider类来实现爬取小说列表和小说信息的功能,然后定义了一个SpiderThread类来作为爬取线程,最后在主函数中创建小说队列和爬取线程,并等待所有线程结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值