鱼C论坛

 找回密码
 立即注册
查看: 5476|回复: 17

[已解决]python爬虫,求助

[复制链接]
发表于 2022-4-1 19:17:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想用爬虫爬取一下番茄小说里的小说,叫“西游记之神魔”,采用的是异步操作,但现在程序出了问题,关键是我还找不出来问题在哪,全屏都是traceback,求大佬帮忙
最佳答案
2022-4-1 21:00:29
本帖最后由 isdkz 于 2022-4-2 10:07 编辑
莫凡辰 发表于 2022-4-1 20:35
好的,这就粘上来


异步全屏是 traceback 很正常,因为其中一个协程出错不会导致主程序终止,

你的程序哪个地方写错了,每一个协程都出错就全屏 traceback 了

我给你改了一下,你看看:
import requests
import asyncio
import aiohttp
from lxml import etree
import aiofiles
"""
1.同步操作:首先获取番茄小说指定小说的页面url,此处用的是西游记
2.利用xpath将url中章节的名称以及超链接取出
3.异步操作:将超链接拼接成新的url,进而获取对应章节的内容
4.将内容进行保存
"""
async def aiodownload(href,name):
    url = 'https://fanqienovel.com'+f'{href}'                  # 这里把 f'href' 改为 f'{href}',格式化字符串你完全可以直接用  f'https://fanqienovel.com{href}' 
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            html = etree.HTML(await resp.text())            # 这里改为 await resp.text()
            async with aiohttp.ClientSession() as session:
                async with session.get(url) as resp:
                    content = html.xpath('//*[@class="muye-reader-content noselect"]/div/p/text()')
                    if not content:       # 加上这个逻辑判断,因为有一些需要在 app 才能看的章节的路径不一样(会匹配不上),而且内容不全,你可以直接跳过,或者用正确的路径得到一部分内容
                        content = html.xpath('//*[@class="muye-reader-content noselect"]/p/text()')
                    async with aiofiles.open(f'{name}.txt','w',encoding='utf-8') as f:             # 这里 f'{name}' 改为 f'{name}.txt'
                        await f.write('\n\n'.join(content))          # 这里 content 改为 '\n\n'.join(content),因为匹配到的 content 是列表,你得用换行把它拼成字符串



async def get_name(url):
    headers = {'User-Agent':'Mozilla/5.0'}                   # UA 可以不用写那么长,写个关键的 Mozilla/5.0 就行了
    resp = requests.get(url,headers=headers)
    html = etree.HTML(resp.text)
    chapter = html.xpath('//*[@class="page-directory-content"]/div/div[2]')[0]
    divs = chapter.xpath('./div')
    tasks = []
    for div in divs:
        name = div.xpath('./a/text()')[0]
        href = div.xpath('./a/@href')[0]
        #准备异步任务
        tasks.append(aiodownload(href,name))
    await asyncio.wait(tasks)

if __name__ == '__main__':
    url = 'https://fanqienovel.com/page/7042250335695408159'
    loop = asyncio.get_event_loop()              # 创建一个 loop 来运行协程,否则主线程会提前结束,协程执行完成后没有主线程会报 RuntimeError: Event loop is closed 的错误
    loop.run_until_complete(get_name(url))    # 使用 loop 的 run_until_complete

小说

小说

程序

程序

程序

程序
2022-04-01 (3).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 19:19:51 | 显示全部楼层

回帖奖励 +2 鱼币

把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-1 20:34:59 | 显示全部楼层
原代码:
import requests
import asyncio
import aiohttp
from lxml import etree
import aiofiles
"""
1.同步操作:首先获取番茄小说指定小说的页面url,此处用的是西游记
2.利用xpath将url中章节的名称以及超链接取出
3.异步操作:将超链接拼接成新的url,进而获取对应章节的内容
4.将内容进行保存
"""
async def aiodownload(href,name):
    url = 'https://fanqienovel.com'+f'href'
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            html = etree.HTML(resp.text)
            async with aiohttp.ClientSession() as session:
                async with session.get(url) as resp:
                    content = html.xpath('//*[@class="muye-reader-content noselect"]/div/p/text()')
                    async with aiofiles.open(f'{name}','w',encoding='utf-8') as f:
                        await f.write(content)



async def get_name(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55'}
    resp = requests.get(url,headers=headers)
    html = etree.HTML(resp.text)
    chapter = html.xpath('//*[@class="page-directory-content"]/div/div[2]')[0]
    divs = chapter.xpath('./div')
    tasks = []
    for div in divs:
        name = div.xpath('./a/text()')[0]
        href = div.xpath('./a/@href')[0]
        #准备异步任务
        tasks.append(aiodownload(href,name))
    await asyncio.wait(tasks)

if __name__ == '__main__':
    url = 'https://fanqienovel.com/page/7042250335695408159'
    asyncio.run(get_name(url))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-1 20:35:32 | 显示全部楼层
isdkz 发表于 2022-4-1 19:19
把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的

好的,这就粘上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-1 21:00:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-4-2 10:07 编辑
莫凡辰 发表于 2022-4-1 20:35
好的,这就粘上来


异步全屏是 traceback 很正常,因为其中一个协程出错不会导致主程序终止,

你的程序哪个地方写错了,每一个协程都出错就全屏 traceback 了

我给你改了一下,你看看:
import requests
import asyncio
import aiohttp
from lxml import etree
import aiofiles
"""
1.同步操作:首先获取番茄小说指定小说的页面url,此处用的是西游记
2.利用xpath将url中章节的名称以及超链接取出
3.异步操作:将超链接拼接成新的url,进而获取对应章节的内容
4.将内容进行保存
"""
async def aiodownload(href,name):
    url = 'https://fanqienovel.com'+f'{href}'                  # 这里把 f'href' 改为 f'{href}',格式化字符串你完全可以直接用  f'https://fanqienovel.com{href}' 
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            html = etree.HTML(await resp.text())            # 这里改为 await resp.text()
            async with aiohttp.ClientSession() as session:
                async with session.get(url) as resp:
                    content = html.xpath('//*[@class="muye-reader-content noselect"]/div/p/text()')
                    if not content:       # 加上这个逻辑判断,因为有一些需要在 app 才能看的章节的路径不一样(会匹配不上),而且内容不全,你可以直接跳过,或者用正确的路径得到一部分内容
                        content = html.xpath('//*[@class="muye-reader-content noselect"]/p/text()')
                    async with aiofiles.open(f'{name}.txt','w',encoding='utf-8') as f:             # 这里 f'{name}' 改为 f'{name}.txt'
                        await f.write('\n\n'.join(content))          # 这里 content 改为 '\n\n'.join(content),因为匹配到的 content 是列表,你得用换行把它拼成字符串



async def get_name(url):
    headers = {'User-Agent':'Mozilla/5.0'}                   # UA 可以不用写那么长,写个关键的 Mozilla/5.0 就行了
    resp = requests.get(url,headers=headers)
    html = etree.HTML(resp.text)
    chapter = html.xpath('//*[@class="page-directory-content"]/div/div[2]')[0]
    divs = chapter.xpath('./div')
    tasks = []
    for div in divs:
        name = div.xpath('./a/text()')[0]
        href = div.xpath('./a/@href')[0]
        #准备异步任务
        tasks.append(aiodownload(href,name))
    await asyncio.wait(tasks)

if __name__ == '__main__':
    url = 'https://fanqienovel.com/page/7042250335695408159'
    loop = asyncio.get_event_loop()              # 创建一个 loop 来运行协程,否则主线程会提前结束,协程执行完成后没有主线程会报 RuntimeError: Event loop is closed 的错误
    loop.run_until_complete(get_name(url))    # 使用 loop 的 run_until_complete
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-1 22:02:53 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-1 22:12:49 | 显示全部楼层

回帖奖励 +2 鱼币

妈耶,这么牛逼?不过番茄本身就是免费的啊,为啥不直接看呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-1 22:24:41 | 显示全部楼层

回帖奖励 +2 鱼币

isdkz 发表于 2022-4-1 19:19
把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-2 00:52:18 | 显示全部楼层

回帖奖励 +2 鱼币

6666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-2 01:27:11 | 显示全部楼层

回帖奖励 +2 鱼币

爬虫学到的好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-2 10:38:00 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-2 13:52:12 | 显示全部楼层

回帖奖励 +2 鱼币

C丁洞杀O 发表于 2022-4-1 22:12
妈耶,这么牛逼?不过番茄本身就是免费的啊,为啥不直接看呢?

爬虫不就是爬免费资源的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-2 14:37:05 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-2 15:39:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-2 21:47:13 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-3 08:27:12 | 显示全部楼层
C丁洞杀O 发表于 2022-4-1 22:12
妈耶,这么牛逼?不过番茄本身就是免费的啊,为啥不直接看呢?

刚学完异步爬虫,想练练手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-3 08:32:52 | 显示全部楼层
isdkz 发表于 2022-4-1 21:00
异步全屏是 traceback 很正常,因为其中一个协程出错不会导致主程序终止,

你的程序哪个地方写错了 ...

多谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-22 22:06:33 | 显示全部楼层
有一点想问一问,就是这番茄的小说网页版上的后面都没有前几章的,可以尝试下app爬取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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