specail 发表于 2021-12-14 11:38:44

异步爬取文件写入问题

异步的写法应该没有问题。已经能创建文件了,但是应该是写入部分出了问题。创建的文件没有写入操作,里面内容是空,写入时有报错。请指导。附源码

import requests
from bs4 import BeautifulSoup
import aiohttp
import aiofiles
import asyncio
import bs4
import re
from lxml import html

def getHtml(url,headers):
    try:
      r = requests.get(url,headers)
      r.raise_for_status()
      r.encoding = r.apparent_encoding
      return r.text
    except Exception as e:
      print("访问页面有误!",e)
      return ""

def getChater(html):
    domain = "https://www.bbiquge.net/book_84680/"
    resultls = {}
    gcbs = BeautifulSoup(html,"html.parser")
    for dd ingcbs.find('div',class_="zjbox").dl:#章节内容对应的标签
      if isinstance(dd,bs4.element.Tag):
            if dd.name == "dd" and dd.string != None:
                #print(dd.a.string,dd.a.get("href"))   
                resultls=domain + dd.a.get("href")      #返回章节名及链接
    return resultls


            
async def getContent(url,filename):   #传过来的字典是 章节名:链接
    async with aiohttp.ClientSession() as session:
      async with session.get(url) as resp:
            html =await resp.text()
            # bs = BeautifulSoup(html,"html.parser").find("div",id="content")
            # content = bs.find("div",id="content")
            async with open(filename+".txt","w",encoding="utf-8") as f:
                await f.write(BeautifulSoup(html,"html.parser").find("div",id="content").text.replace('\xa0'*4,'\n\n       '))#处理符号,整理格式
            print("done!"+filename)
            
      
            

async def main():
    url = "https://www.bbiquge.net/book_84680/"
    headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36 Edg/96.0.1054.53"
    }
    html = getHtml(url,headers)
    #获得 章节名及链接
    resultls = getChater(html)
    # 异步下载章节内容
    tasks = []
    for item in resultls.items():
      tasks.append(asyncio.create_task(getContent(item,item)))
    await asyncio.wait(tasks)   
   
if __name__ == "__main__":
    loop =asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(main())

specail 发表于 2021-12-16 11:59:30

open时改用,aiofiles.open解决了
但是新的问题是爬到后面好像有编码问题无法解析,估计是aiohttp库的问题

wp231957 发表于 2021-12-14 11:38:45

specail 发表于 2021-12-15 08:46


python 本身就是同步的,并不擅长处理异步问题,(异步我也不懂)

所以,很想知道你的动机   是练习用吗 否则 同步爬取就可以啦

specail 发表于 2021-12-14 15:29:05

自顶

specail 发表于 2021-12-15 08:46:01

{:5_103:}

specail 发表于 2021-12-15 10:07:06

wp231957 发表于 2021-12-15 10:04
python 本身就是同步的,并不擅长处理异步问题,(异步我也不懂)

所以,很想知道你的动机   是练习用 ...

异步爬取的效率更高,更多情况需要异步协程跟多线程结合,这个我自己发现问题了。是我导了包忘记用了{:10_250:}

z5560636 发表于 2021-12-15 10:12:39

specail 发表于 2021-12-15 10:07
异步爬取的效率更高,更多情况需要异步协程跟多线程结合,这个我自己发现问题了。是我导了包忘记用了{:10 ...

我还以为是异步往同一个文件里面写,脑海中重在构思上次看到的资料,python目前不支持文件锁。
页: [1]
查看完整版本: 异步爬取文件写入问题