鱼C论坛

 找回密码
 立即注册
查看: 2529|回复: 3

python写入文件的权限问题Permissionerror[Errno 1]

[复制链接]
发表于 2020-2-5 13:38:22 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 1404461012 于 2020-2-5 14:00 编辑

我写好的爬虫在自己的电脑(windows系统)上运行很好,把他发给别人(linux系统)使用时出错,出错信息 如图 ,出错的那行正在写入下载的网址,写入的文件在程序的前半部分创建过。我经过各种调试也不能引发这个错误,不知道怎么修改,求助大佬。
以下是代码(运行需要命令行窗口传入参数):
  1. import os
  2. import time
  3. from concurrent.futures import ThreadPoolExecutor
  4. from itertools import repeat

  5. import requests
  6. from lxml import etree


  7. def download(image_url, to_dir):
  8.     suffix = image_url.split('.')[-1]
  9.     image_id = image_url.split('/')[-1].split('%20')[2]  # 从url里获取id
  10.     filename = os.path.join(to_dir, "%s.%s" % (image_id, suffix))
  11.     if not os.path.exists(filename):
  12.         try:
  13.             response = requests.get(image_url)
  14.             with open(filename, 'wb') as f:
  15.                 f.write(response.content)
  16.                 print("downloaded:", filename)
  17.         except Exception as e:
  18.             print("WARNING: image download failed: id=%s, url=%s" % (image_id, image_url))
  19.             print(e)
  20.     else:
  21.         print(filename + "已下载,跳过\n")


  22. def get_pages(from_page=1, to_page=10000, to_dir=None, search_keyword=''):
  23.     workers = 16
  24.     url_text = os.path.join(to_dir, search_keyword + '图片', "下载地址.txt")
  25.     url_mode = 'http://konachan.net/post?page=%s&tags=' + search_keyword
  26.     xpath_images = "//a[@class='directlink largeimg' or @class='directlink smallimg']/@href"
  27.     to_dir = os.path.join(to_dir, search_keyword + '图片')
  28.     if not os.path.exists(to_dir):
  29.         os.makedirs(to_dir)
  30.     if not os.path.exists(os.path.join(to_dir, 'record.txt')):
  31.         open(os.path.join(to_dir, 'record.txt'), 'w')
  32.         new = True
  33.     else:
  34.         from_page = int(open(os.path.join(to_dir, 'record.txt'), 'r').readlines()[0])
  35.         new = False
  36.     if not os.path.exists(url_text):
  37.         open(url_text, 'w')



  38.     for page in range(from_page, to_page + 1):
  39.         time.sleep(1)
  40.         page_url = url_mode % page
  41.         print("view page:", page, page_url)
  42.         try:
  43.             html = requests.get(page_url).text
  44.         except:
  45.             print("WARNING: request page failed, page=%s, url=%s" % (page, page_url))
  46.             continue
  47.         tree = etree.HTML(html)
  48.         image_urls = tree.xpath(xpath_images)
  49.         print("image count of this page:", len(image_urls))
  50.         if new == True:
  51.             with open(url_text, 'a') as f:
  52.                 for line in image_urls:
  53.                     f.write(line + '\n')
  54.                 f.write('\n')
  55.         else:
  56.             new = True
  57.         try:
  58.             os.makedirs(os.path.join(to_dir,"page%d" % page))
  59.         except:
  60.             pass

  61.         with open(os.path.join(to_dir, 'record.txt'), 'w') as f:
  62.             f.write(str(page))

  63.         with ThreadPoolExecutor(workers) as executor:
  64.             executor.map(download, image_urls, repeat(os.path.join(to_dir, "page%d"%page)), timeout=100)


  65. def main():
  66.     from argparse import ArgumentParser
  67.     parser = ArgumentParser()
  68.     parser.add_argument('--to_dir', required=True, help="saving dir")
  69.     parser.add_argument('--keyword', default='', type=str, help="search keyword")
  70.     parser.add_argument('--from_page', default=1, type=int, help="first page to download")
  71.     parser.add_argument('--to_page', default=10000, type=int, help="last page to download")
  72.     args = parser.parse_args()

  73.     get_pages(from_page=args.from_page, to_page=args.to_page, to_dir=args.to_dir, search_keyword=args.keyword)


  74. if __name__ == '__main__':
  75.     main()
复制代码

XQJ{F%M9WF{SO[MI%L7%VAU.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-5 13:43:08 | 显示全部楼层
无权限写入文件。试试这样:

  1. import os
  2. import time
  3. from concurrent.futures import ThreadPoolExecutor
  4. from itertools import repeat

  5. import requests
  6. from lxml import etree


  7. def download(image_url, to_dir):
  8.     suffix = image_url.split('.')[-1]
  9.     image_id = image_url.split('/')[-1].split('%20')[2]  # 从url里获取id
  10.     filename = os.path.join(to_dir, "%s.%s" % (image_id, suffix))
  11.     if not os.path.exists(filename):
  12.         try:
  13.             response = requests.get(image_url)
  14.             with open(filename, 'wb') as f:
  15.                 f.write(response.content)
  16.                 print("downloaded:", filename)
  17.         except Exception as e:
  18.             print("WARNING: image download failed: id=%s, url=%s" % (image_id, image_url))
  19.             print(e)
  20.     else:
  21.         print(filename + "已下载,跳过\n")


  22. def get_pages(from_page=1, to_page=10000, to_dir=None, search_keyword=''):
  23.     workers = 16
  24.     url_text = os.path.join(to_dir, search_keyword + '图片', "下载地址.txt")
  25.     url_mode = 'http://konachan.net/post?page=%s&tags=' + search_keyword
  26.     xpath_images = "//a[@class='directlink largeimg' or @class='directlink smallimg']/@href"
  27.     to_dir = os.path.join(to_dir, search_keyword + '图片')
  28.     if not os.path.exists(to_dir):
  29.         os.makedirs(to_dir)
  30.     if not os.path.exists(os.path.join(to_dir, 'record.txt')):
  31.         open(os.path.join(to_dir, 'record.txt'), 'w')
  32.         new = True
  33.     else:
  34.         from_page = int(open(os.path.join(to_dir, 'record.txt'), 'r').readlines()[0])
  35.         new = False
  36.     if not os.path.exists(url_text):
  37.         open(url_text, 'w')

  38.     for page in range(from_page, to_page + 1):
  39.         time.sleep(1)
  40.         page_url = url_mode % page
  41.         print("view page:", page, page_url)
  42.         try:
  43.             html = requests.get(page_url).text
  44.         except:
  45.             print("WARNING: request page failed, page=%s, url=%s" % (page, page_url))
  46.             continue
  47.         tree = etree.HTML(html)
  48.         image_urls = tree.xpath(xpath_images)
  49.         print("image count of this page:", len(image_urls))
  50.         if new == True:
  51.             try:
  52.                 with open(url_text, 'a') as f:
  53.                     for line in image_urls:
  54.                         f.write(line + '\n')
  55.                     f.write('\n')
  56.             except PermissionError:
  57.                 pass
  58.         else:
  59.             new = True
  60.         try:
  61.             os.makedirs(os.path.join(to_dir,"page%d" % page))
  62.         except:
  63.             pass

  64.         with open(os.path.join(to_dir, 'record.txt'), 'w') as f:
  65.             f.write(str(page))

  66.         with ThreadPoolExecutor(workers) as executor:
  67.             executor.map(download, image_urls, repeat(os.path.join(to_dir, "page%d"%page)), timeout=100)


  68. def main():
  69.     from argparse import ArgumentParser
  70.     parser = ArgumentParser()
  71.     parser.add_argument('--to_dir', required=True, help="saving dir")
  72.     parser.add_argument('--keyword', default='', type=str, help="search keyword")
  73.     parser.add_argument('--from_page', default=1, type=int, help="first page to download")
  74.     parser.add_argument('--to_page', default=10000, type=int, help="last page to download")
  75.     args = parser.parse_args()

  76.     get_pages(from_page=args.from_page, to_page=args.to_page,
  77.               to_dir=args.to_dir, search_keyword=args.keyword)


  78. if __name__ == '__main__':
  79.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-5 13:50:45 | 显示全部楼层
zltzlt 发表于 2020-2-5 13:43
无权限写入文件。试试这样:

可是我就是想让它写进去呀,这是我代码第36行创建的txt文件呀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-5 14:26:58 | 显示全部楼层
1404461012 发表于 2020-2-5 13:50
可是我就是想让它写进去呀,这是我代码第36行创建的txt文件呀

以管理员权限运行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-22 04:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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