lzhlmcl 发表于 2021-8-23 20:15

python爬虫求助

爬取wallhaven图片时,在代码第23行总会错误,显示为IndexError: list index out of range;经过排查发现似乎是获取的是空值导致了这个原因,尝试过添加cookies也没有解决.求助各位大佬# -*- coding:utf-8 -*-
import requests
import time
from lxml import etree

li_list = []
start_time = time.time()

for page in range(1, 23):
        url = f'https://wallhaven.cc/search?q=car&categories=111&purity=111&sorting=relevance&order=desc&page={page}'
        headers = {
                'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Mobile Safari/537.36'
        }

        page_text = requests.get(url=url, headers=headers).text
        tree = etree.HTML(page_text)
        now_li_list = tree.xpath('//a[@class="preview"]/@href')
        print(f'第{page}页获取到{len(now_li_list)}张图片!!')
        print('正在获取详情页....')
        for image_url in now_li_list:
                detail_page = requests.get(url=image_url, headers=headers).text
                detail_tree = etree.HTML(detail_page)
                image_src_url = detail_tree.xpath('//img[@id="wallpaper"]/@src')
                li_list.append(image_src_url)
                print(f'添加{image_url[-10:]}完成..')
        time.sleep(0.2)
end_time = time.time()
print(f'总共获取到{len(li_list)}张图片....')
print(f'耗时{end_time - start_time}秒...')


with open('url.txt', 'a', encoding='utf-8') as f:
        for url in li_list:
                f.write(url + '\n')
print('存储完成!')

johnMC 发表于 2021-8-23 20:15

lzhlmcl 发表于 2021-8-23 23:35
感谢,应该不是这个问题,如我楼上回复的,我重新测试能够跑了,但就是速度特别慢,跑到第4页就不动了,我想问 ...

每次请求打印状态码出来,text打印出来,设置timeout, 实在不行在for循环里面try一下,看下错误再分析分析

muyan1995 发表于 2021-8-23 21:22

试试改成这样image_src_url = detail_tree.xpath('//img[@id="wallpaper"]/@src') if detail_tree.xpath('//img[@id="wallpaper"]/@src') else ''

咸鱼灭 发表于 2021-8-23 21:34

我运行没问题,怕报错你可以加个判断试试
import requests
import time
from lxml import etree

li_list = []
start_time = time.time()

for page in range(2):
    url = f'https://wallhaven.cc/search?q=car&categories=111&purity=111&sorting=relevance&order=desc&page={page}'
    headers = {
      'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Mobile Safari/537.36'
    }

    page_text = requests.get(url=url, headers=headers).text
    tree = etree.HTML(page_text)
    now_li_list = tree.xpath('//a[@class="preview"]/@href')
    print(now_li_list)
    print(f'第{page}页获取到{len(now_li_list)}张图片!!')
    print('正在获取详情页....')
    for image_url in now_li_list:
      detail_page = requests.get(url=image_url, headers=headers).text
      detail_tree = etree.HTML(detail_page)
      image_src_url = detail_tree.xpath('//img[@id="wallpaper"]/@src')
      if image_src_url:
            li_list.append(image_src_url)
            print(f'添加{image_url[-10:]}完成..')
    time.sleep(0.2)
end_time = time.time()
print(f'总共获取到{len(li_list)}张图片....')
print(f'耗时{end_time - start_time}秒...')

with open('url.txt', 'a', encoding='utf-8') as f:
    for url in li_list:
      f.write(url + '\n')
print('存储完成!')

johnMC 发表于 2021-8-23 23:13

上面写几楼写的都可以,如果还频繁出现的话,看下状态码是不是200,还有是不是访问频率太高,被禁了,导致xpath解析失败

lzhlmcl 发表于 2021-8-23 23:27

muyan1995 发表于 2021-8-23 21:22
试试改成这样image_src_url = detail_tree.xpath('//img[@id="wallpaper"]/@src' ...

感谢大佬回复,,因为电脑老是因为内存条的原因死机,我就拆了一根,,然后就想到内存会不会影响到代码,,,于是重新测试了发现就能够正常运行{:1_896:},我也不太懂其中的原理,我想问问大佬有没有黑马比较新的python课程再学习一下..

lzhlmcl 发表于 2021-8-23 23:31

johnMC 发表于 2021-8-23 23:13
上面写几楼写的都可以,如果还频繁出现的话,看下状态码是不是200,还有是不是访问频率太高,被禁了,导致x ...

感谢大佬回复,,因为电脑老是因为内存条的原因死机,我就拆了一根,,然后就想到内存会不会影响到代码,,,于是重新测试了发现就能够正常运行{:1_896:},我也不太懂其中的原理,我想问问大佬有没有黑马比较新的python课程再学习一下..

lzhlmcl 发表于 2021-8-23 23:35

johnMC 发表于 2021-8-23 23:13
上面写几楼写的都可以,如果还频繁出现的话,看下状态码是不是200,还有是不是访问频率太高,被禁了,导致x ...

感谢,应该不是这个问题,如我楼上回复的,我重新测试能够跑了,但就是速度特别慢,跑到第4页就不动了,我想问下有没有什么解决方法

prince_cool 发表于 2021-8-24 00:05

本帖最后由 prince_cool 于 2021-8-24 00:07 编辑

我看xpath是不是可以直接用这个啊//img/@data-src;不需要再访问多一个网址了

AsuraSong 发表于 2021-8-24 00:16

楼主说拆掉内存后可以正常使用,是不是因为本身软件没有匹配双通道?
页: [1] 2
查看完整版本: python爬虫求助