鱼C论坛

 找回密码
 立即注册
查看: 1480|回复: 6

[已解决]关于代码无法触发for循环的问题

[复制链接]
发表于 2020-7-20 21:12:20 | 显示全部楼层 |阅读模式

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

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

x
  1. #导包
  2. import requests
  3. import time
  4. import os
  5. import threading
  6. import parsel


  7. if not os.path.exists('image'):
  8.     os.mkdir('image')


  9. base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'

  10. headers = {
  11.     'User-Agent':
  12.         'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
  13. }



  14. def get(url,headers,cookie):
  15.     '''请求数据'''
  16.     response = requests.get(url,headers)
  17.     html_data = response.text
  18.     return html_data


  19. def parsel_data(html_data):
  20.     '''筛选数据'''
  21.     selector = parsel.Selector(html_data)
  22.     result_list = selector.xpath('//span[@class="img_block_big"]')

  23.     for result in result_list:
  24.         image_url = result.xpath('./a/picture/source/img/@src').extract_first()
  25.         image_id = result.xpath('./a/picture/source/img/@id').extract_first()

  26.         img_url = 'https:' + image_url #手动拼url

  27.         all_title = img_url

  28.         img_data = requests.get(url = all_title,headers = headers).content

  29.         return all_title,image_id,img_data


  30. def save(all_title,image_id,img_data):
  31.     '''保存数据'''
  32.     try:
  33.         with open('image\\' + all_title,  mode='wb') as f:
  34.             print('保存成功:', image_id)
  35.             f.write(img_data)

  36.     except:
  37.         pass
  38.         print('保存失败')


  39. def sleep(time):
  40.     '''休眠'''
  41.     time.sleep(time)



  42. for _ in  range(0,100):
  43.     html_data = get(url=base_url, headers=headers)
  44.     image_data = parsel_data(html_data = html_data)

  45.     all_title = image_data[0] #url https://xxxxxxx...
  46.     img_id = image_data[1] #ID号
  47.     img_data = image_data[2] #数据

  48.     print(all_title,img_id,img_data)

复制代码




如果调试的话 会发现他一直在重复同一个图片的数据
最佳答案
2020-7-21 10:49:21
本帖最后由 yjsx86 于 2020-7-21 10:50 编辑

让parsel_data函数变成生成器就行


  1. # 导包
  2. import requests
  3. import time
  4. import os
  5. import threading
  6. import parsel

  7. if not os.path.exists('image'):
  8.     os.mkdir('image')

  9. base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'

  10. headers = {
  11.     'User-Agent':
  12.         'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
  13. }


  14. def get(url, headers):
  15.     '''请求数据'''
  16.     response = requests.get(url, headers)
  17.     html_data = response.text
  18.     return html_data


  19. def parsel_data(html_data):
  20.     '''筛选数据'''
  21.     selector = parsel.Selector(html_data)
  22.     result_list = selector.xpath('//span[@class="img_block_big"]')

  23.     for result in result_list:
  24.         image_url = result.xpath('./a/picture/source/img/@src').extract_first()
  25.         image_id = result.xpath('./a/picture/source/img/@id').extract_first()

  26.         img_url = 'https:' + image_url  # 手动拼url

  27.         all_title = img_url

  28.         img_data = requests.get(url=all_title, headers=headers).content

  29.         # return 改 yield
  30.         yield all_title, image_id, img_data


  31. def save(all_title, image_id, img_data):
  32.     '''保存数据'''
  33.     try:
  34.         with open('image\\' + all_title, mode='wb') as f:
  35.             print('保存成功:', image_id)
  36.             f.write(img_data)

  37.     except:
  38.         pass
  39.         print('保存失败')


  40. def sleep(time):
  41.     '''休眠'''
  42.     time.sleep(time)


  43. if __name__ == '__main__':
  44.     html_data = get(url=base_url, headers=headers)
  45.     for image_data in parsel_data(html_data):
  46.         all_title = image_data[0]  # url https://xxxxxxx...
  47.         img_id = image_data[1]  # ID号
  48.         img_data = image_data[2]  # 数据
  49.         print(all_title, img_id, img_data)
复制代码

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-20 21:13:51 | 显示全部楼层
如果各位鱼油调试的话 会发现parsel_data()的提取图片没用 提出来的都是同一个图片数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-21 06:14:06 | 显示全部楼层
调试过后 发现的是parsel_data()函数内的return没有进行循环 一直返还同一个图片数据 其他的参数目前正常
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-21 09:17:47 | 显示全部楼层

  1. def parsel_data(html_data):
  2.     '''筛选数据'''
  3.     selector = parsel.Selector(html_data)
  4.     result_list = selector.xpath('//span[@class="img_block_big"]')

  5.     for result in result_list:
  6.         image_url = result.xpath('./a/picture/source/img/@src').extract_first()
  7.         image_id = result.xpath('./a/picture/source/img/@id').extract_first()

  8.         img_url = 'https:' + image_url #手动拼url

  9.         all_title = img_url

  10.         img_data = requests.get(url = all_title,headers = headers).content

  11.         return all_title,image_id,img_data
复制代码


首先我自己这里尝试了一下,可能是因为版本的原因,你的代码还缺少cookie
然后这段代码貌似有些问题
你的return写在了循环里面,在一个方法里,你使用了return,代码运行到这个地方就停止了

然后再给你个简单的例子,自己试验一下

  1. names = ['Michael', 'Bob', 'Tracy']

  2. def name():
  3.     for name in names:
  4.         # print(name)
  5.         sn = name
  6.         return sn


  7. if __name__ == '__main__':
  8.     a = name()
  9.     print(a)
复制代码


在这个例子里你就可以知道为什么循环只执行一次就没有了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-21 10:49:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yjsx86 于 2020-7-21 10:50 编辑

让parsel_data函数变成生成器就行


  1. # 导包
  2. import requests
  3. import time
  4. import os
  5. import threading
  6. import parsel

  7. if not os.path.exists('image'):
  8.     os.mkdir('image')

  9. base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'

  10. headers = {
  11.     'User-Agent':
  12.         'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
  13. }


  14. def get(url, headers):
  15.     '''请求数据'''
  16.     response = requests.get(url, headers)
  17.     html_data = response.text
  18.     return html_data


  19. def parsel_data(html_data):
  20.     '''筛选数据'''
  21.     selector = parsel.Selector(html_data)
  22.     result_list = selector.xpath('//span[@class="img_block_big"]')

  23.     for result in result_list:
  24.         image_url = result.xpath('./a/picture/source/img/@src').extract_first()
  25.         image_id = result.xpath('./a/picture/source/img/@id').extract_first()

  26.         img_url = 'https:' + image_url  # 手动拼url

  27.         all_title = img_url

  28.         img_data = requests.get(url=all_title, headers=headers).content

  29.         # return 改 yield
  30.         yield all_title, image_id, img_data


  31. def save(all_title, image_id, img_data):
  32.     '''保存数据'''
  33.     try:
  34.         with open('image\\' + all_title, mode='wb') as f:
  35.             print('保存成功:', image_id)
  36.             f.write(img_data)

  37.     except:
  38.         pass
  39.         print('保存失败')


  40. def sleep(time):
  41.     '''休眠'''
  42.     time.sleep(time)


  43. if __name__ == '__main__':
  44.     html_data = get(url=base_url, headers=headers)
  45.     for image_data in parsel_data(html_data):
  46.         all_title = image_data[0]  # url https://xxxxxxx...
  47.         img_id = image_data[1]  # ID号
  48.         img_data = image_data[2]  # 数据
  49.         print(all_title, img_id, img_data)
复制代码

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-21 10:54:48 | 显示全部楼层
yjsx86 发表于 2020-7-21 10:49
让parsel_data函数变成生成器就行

我早上也确实改成了yiled 但是就没法切片了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-21 10:57:03 | 显示全部楼层
yjsx86 发表于 2020-7-21 10:49
让parsel_data函数变成生成器就行

感谢大佬的帮助 本帖还没完呢 待会可能有新bug
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 00:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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