首页 > 其他分享 >爬虫-异步抓取一部小说

爬虫-异步抓取一部小说

时间:2024-01-26 21:59:10浏览次数:19  
标签:章节 异步 name get text 爬虫 抓取 session link

一、利用requests请求同步和aiohttp异步,两个结合来获取小说里的内容

1、先利用cookie和session来实现登录

  • 根据post请求,带入参数来建立会话,并获取session
  • 利用session来进行同步请求获取,每一章节的名称和链接地址

 通过上面的图,发现在/html/body/div[5]/dl/dd范围内的a标签里面存放着小说章节名称和链接地址,点击章节的地址就可以跳转到对应的章节页面,所以可以使用xpath来通过a标签来获取章节名称和URL地址

又因为章节名和URL地址的网络请求只有一个,或者说只有请求到章节名称和链接才能获取每章节的内容,所有可以直接用requests同步请求的方式来获取,牵涉到登录问题,用seesion来请求,如下

if __name__ == '__main__':
    # 建立session会话
    session = requests.Session()
    hearder = {
        "User - Agent":
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
    data = {
        "loginName": "13xxxxxxxxx",
        "password": "zpxxxxx"
    }
    # 1、登录:(这里的浏览器必须是login登录按钮的链接)
    url = "https://passport.17k.com/ck/user/login"
    # 2、可以用F12检查浏览器的请求情况:可以找到cookie  把请求和cookie带进去 post还是get可以在浏览器中看到
    session.post(url=url, data=data)
    # 3、用sesion请求获取
    time.sleep(1)
    chapter_list = "https://www.17k.com/list/3378901.html"
#获取的章节名和URL链接的网络请求只有一个,直接使用requests请求库发送同步请求
async def get_link(chapter_list,session):
    response = session.get(chapter_list)
    response.encoding = 'utf-8'
    Xpath = etree.HTML(response.text)
    a_list = Xpath.xpath('/html/body/div[5]/dl/dd/a')
    for a in a_list:
        # #获取每章节的url链接
        links = a.xpath('./@href')
        linklist = ['https://www.17k.com/' + link for link in links]
        ##获取每章节的名字
        names = xpath('./span/text()')
        namelist = [name for name in names]
        # namelist = [names.replace('\n', '').replace('\t', '') for name in names]
        # 将名字和url链接合并成一个元组
        name_link_list = zip(namelist,linklist)
        #获取到URL链接和章节名后,需要构造一个task任务列表来作为异步协程的可等待对象
        task = []
        for name ,link in name_link_list:
            task.append(get_text())

获取每章节的小说内容:

async def get_text(name,link):
    async with aiohttp.ClientSession()as session:
        async with session.get(url= link) as response:
            html = await response.text()
            text = html.xpath('//*[@id="readArea"]/div[1]/div[2]/p/text()')
            await save_data(name,link)

将上一步获取到的章节名和URL链接传到async声明定义的get_text()方法中,使用with块来使用aiohttp.ClientSession()方法发送异步请求,其中:

aiohttp.ClientSession() as session <------->相当于requests赋给session,说session相当于requests;发送网络请求、传入的参数、返回响应内容都和requests请求库大同小异,只是aiohttp请求库需要用async和await进行声明,将获取到的小说内容和章节名传入到定义的save_data()中

 

保存小说到文本中,异步需要用async来声明,

async def save_data(name,text):
f=open(f'小说/{name}.text','w',encoding='utf-8')
for texts in text:
f.write(texts)
f.write('\n')
print(f'正在爬取{name}')

最后调用asyncio.get_event_loop()方法进入事件循环,再调用loop.run_until_complete(get_link())方法运行事件循环,直到get_link()方法运行结束。

    loop = asyncio.get_event_loop()
    loop.run_until_complete(get_link(chapter_list,session))

文档参照来自https://zhuanlan.zhihu.com/p/416279762

标签:章节,异步,name,get,text,爬虫,抓取,session,link
From: https://www.cnblogs.com/zp513/p/17990739

相关文章

  • MetaGPT day05 MetaGPT 爬虫工程师智能体
    Metagpt爬虫智能体需求1.用ActionNode重写订阅智能体,实现自然语言爬取解析网站内容2.根据尝试实现思路1,即使用llm提取出需要的信息而不是写爬虫代码。3.目前,订阅智能体是通过RunSubscription运行的,即RunSubscription这个action,不仅创建了订阅智能体代码,并启动了Subscriptio......
  • rpa使用自带数据抓取方式抓取页面元素
    大家好,我是一方。今天我们一起看一下如何使用rpa自带的功能来抓取自己想要的页面元素,这里我们以抖音为例来抓取某个领域的作者列表。想要获取页面元素,大概的流程为:确定页面元素、分析页面元素、使用自带的工具便捷抓取元素。我们正式开始,首先新建一个抖音作者列表的项目,并快速......
  • Python中为何使用新语法而不是装饰器来实现async/await异步功能
    Python是一种多范式编程语言,通过引入新的语法和特性,不断提升其功能和灵活性。在异步编程领域,Python引入了async/await关键字来实现协程和异步操作,而不是使用已有的装饰器语法。本文将探讨为何Python选择引入新语法来实现async/await异步功能,以及与装饰器的区别和优势。一、理解异步......
  • RuoYI 框架 异步任务管理
    核心目标代码AsyncManager.me().execute(AsyncFactory.recordLogininfor(username,Constants.LOGIN_FAIL,e.getMessage())) 代码解读  1、异步任务管理类AsyncManager获取Bean对象  2、线程池配置类ThreadPoolConfig创建线程池Bean对象  3、异步工厂AsyncFactory......
  • 事件循环-同步异步-计时器精确问题
    消息队列的解释每个任务都有一个任务类型。同一个类型的任务必须在一个队列中。不同类型的任务可以分属于不同的队列中。在一次事件循环中,浏览器可以【根据实际情况】从不同的队列中取出任务执行。浏览器必须准备好一个微队列,微队列中的任务优先其他所有类型的任务。chrome......
  • 浅谈Python两大爬虫库——urllib库和requests库区别
    在Python中,网络爬虫是一个重要的应用领域。为了实现网络爬虫,Python提供了许多库来发送HTTP请求和处理响应。其中,urllib和requests是两个最常用的库。它们都能够帮助开发人员轻松地获取网页内容,但在使用方式、功能和效率上存在一些差异。本文将深入探讨这两个库的区别,帮助你更好地选......
  • .net 高并发(一,异步编程模型)
    在.NET中,异步编程模型(Async/Await)是一种处理高并发的好方法。它允许开发人员以非阻塞的方式编写异步代码,从而使应用程序能够同时处理多个请求或任务,从而提高并发性能。下面是使用Async/Await进行异步编程的一般步骤:定义一个返回Task或Task<TResult>的方法,并在方法签名中使用as......
  • Vue中JSON文件神奇应用fetch、axios异步加载与模块导入全指南
     在Vue中使用JSON文件有多种方式,包括使用fetch方法加载JSON文件、使用axios库加载JSON文件,以及将JSON文件导入为模块。以下是详细描述和相应的示例代码:1.使用fetch方法加载JSON文件:步骤:创建一个JSON文件,例如 data.json://data.json{"name":"John","age":......
  • 使用CrawlSpider类抓取纵横小说网页内容
    一:根据page页面解析出book_url二:解析来的response(book_url)并不是交给parse_item方法,而是交给了上面的rules处理,然后通过LinkExtractor提取静态页面数据url,url形成一个新的请求交给引擎,引擎一顿操作给到callback=‘parse_item’回调函数三:最后交给parse_item   ......
  • 【Python爬虫】爬虫基础
    爬虫是什么爬虫介绍爬虫的全称为网络爬虫,简称爬虫,别名有网络机器人,网络蜘蛛等等。网络爬虫是一种自动获取网页内容的程序,为搜索引擎提供了重要的数据支撑。搜索引擎通过网络爬虫技术,将互联网中丰富的网页信息保存到本地,形成镜像备份。我们熟悉的谷歌、百度本质上也可理解为一种......