莫凡辰 发表于 2022-4-1 19:17:21

python爬虫,求助

我想用爬虫爬取一下番茄小说里的小说,叫“西游记之神魔”,采用的是异步操作,但现在程序出了问题,关键是我还找不出来问题在哪,全屏都是traceback,求大佬帮忙{:10_266:}

isdkz 发表于 2022-4-1 19:19:51

把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的

莫凡辰 发表于 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')
    divs = chapter.xpath('./div')
    tasks = []
    for div in divs:
      name = div.xpath('./a/text()')
      href = div.xpath('./a/@href')
      #准备异步任务
      tasks.append(aiodownload(href,name))
    await asyncio.wait(tasks)

if __name__ == '__main__':
    url = 'https://fanqienovel.com/page/7042250335695408159'
    asyncio.run(get_name(url))

莫凡辰 发表于 2022-4-1 20:35:32

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

好的,这就粘上来

isdkz 发表于 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')
    divs = chapter.xpath('./div')
    tasks = []
    for div in divs:
      name = div.xpath('./a/text()')
      href = div.xpath('./a/@href')
      #准备异步任务
      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

1050293757 发表于 2022-4-1 22:02:53

{:5_109:}

C丁洞杀O 发表于 2022-4-1 22:12:49

妈耶,这么牛逼?不过番茄本身就是免费的啊,为啥不直接看呢?

myqf123 发表于 2022-4-1 22:24:41

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

{:10_259:}

amazed 发表于 2022-4-2 00:52:18

6666666666666

深谙流年 发表于 2022-4-2 01:27:11

爬虫学到的好

1molHF 发表于 2022-4-2 10:38:00

洋洋痒 发表于 2022-4-2 13:52:12

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

爬虫不就是爬免费资源的吗{:5_103:}

Passepartout 发表于 2022-4-2 14:37:05

{:10_256:}

1050293757 发表于 2022-4-2 15:39:55

{:5_109:}

tjweiyanmin 发表于 2022-4-2 21:47:13

{:5_109:}

莫凡辰 发表于 2022-4-3 08:27:12

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

刚学完异步爬虫,想练练手{:10_256:}

莫凡辰 发表于 2022-4-3 08:32:52

isdkz 发表于 2022-4-1 21:00
异步全屏是 traceback 很正常,因为其中一个协程出错不会导致主程序终止,

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

多谢大佬{:10_297:}

limex2923 发表于 2023-1-22 22:06:33

有一点想问一问,就是这番茄的小说网页版上的后面都没有前几章的{:5_104:},可以尝试下app爬取
页: [1]
查看完整版本: python爬虫,求助