python爬虫,求助
我想用爬虫爬取一下番茄小说里的小说,叫“西游记之神魔”,采用的是异步操作,但现在程序出了问题,关键是我还找不出来问题在哪,全屏都是traceback,求大佬帮忙{:10_266:} 把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的 原代码: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)) isdkz 发表于 2022-4-1 19:19
把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的
好的,这就粘上来 本帖最后由 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 {:5_109:} 妈耶,这么牛逼?不过番茄本身就是免费的啊,为啥不直接看呢?
isdkz 发表于 2022-4-1 19:19
把代码粘贴上来别人才好帮你调试,光看报错信息是很难找出问题的
{:10_259:} 6666666666666 爬虫学到的好 牛 C丁洞杀O 发表于 2022-4-1 22:12
妈耶,这么牛逼?不过番茄本身就是免费的啊,为啥不直接看呢?
爬虫不就是爬免费资源的吗{:5_103:} {:10_256:} {:5_109:} {:5_109:} C丁洞杀O 发表于 2022-4-1 22:12
妈耶,这么牛逼?不过番茄本身就是免费的啊,为啥不直接看呢?
刚学完异步爬虫,想练练手{:10_256:} isdkz 发表于 2022-4-1 21:00
异步全屏是 traceback 很正常,因为其中一个协程出错不会导致主程序终止,
你的程序哪个地方写错了 ...
多谢大佬{:10_297:} 有一点想问一问,就是这番茄的小说网页版上的后面都没有前几章的{:5_104:},可以尝试下app爬取
页:
[1]