鱼C论坛

 找回密码
 立即注册
查看: 1439|回复: 9

[已解决]爬虫求助

[复制链接]
发表于 2020-8-31 13:50:31 | 显示全部楼层 |阅读模式

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

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

x
爬取汽车之家的,数据也正常拿到手了
但因为有些车子是新车,没有二手价的,导致在保存的时候报错
IndexError: list index out of range
不知道有没有大佬可以帮忙解决下


代码如下:

  1. import parsel
  2. import requests
  3. import openpyxl

  4. def get_url(url):
  5.    
  6.     r = requests.get(url, headers=headers).text
  7.     html = parsel.Selector(r)
  8.    
  9.     # 车辆名称
  10.     name = html.xpath('//div[@class="cards-bottom"]/h4/text()').getall()

  11.     # 里程数
  12.     milage = html.xpath('//div[@class="cards-bottom"]/p/text()').getall()
  13.     print(len(milage))

  14.     # 现价
  15.     price = html.xpath('//div[@class="cards-price-box"]/span[1]/text()').getall()

  16.     print(len(price))

  17.     # 原价
  18.     new_price = html.xpath('//div[@class="cards-price-box"]/s/text()').getall()
  19.     print(len(new_price))
  20.    

  21.     datalist = []
  22.     for i,_ in enumerate(name):
  23.         data = []
  24.         data.append(name[i])
  25.         data.append(milage[i].split("/")[0])
  26.         data.append(milage[i].split("/")[1])
  27.         data.append(milage[i].split("/")[2])
  28.         data.append(price[i])
  29.         if price == None:
  30.             continue
  31.         
  32.         data.append(new_price[i])
  33.         if new_price == None:
  34.             continue

  35.         datalist.append(data)
  36.         
  37.    
  38.     return datalist
  39.          
  40. def toexcel(datalist):
  41.     wb = openpyxl.Workbook()
  42.     wb.guess_type = True
  43.     ws = wb.active

  44.     ws.append(['车辆名称','里程数','上牌时间',"地点","现价","原价"])

  45.    
  46.     for each in datalist:
  47.         
  48.         ws.append(each)

  49.     wb.save("汽车之家.xlsx")


  50. if __name__ == "__main__":
  51.    
  52.     headers = {
  53.     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3760.400 QQBrowser/10.5.4083.400'
  54. }
  55.     page = int(input("请输入你要下载的页数:"))
  56.    
  57.     for i in range(1,page+1):
  58.         url = f"https://www.che168.com/china/a0_0msdgscncgpi1ltocsp{i}exx0/?pvareaid=102179#currengpostion"
  59.         print(url)
  60.         datalist = get_url(url)
  61.         toexcel(datalist)

  62.     print("采集完成^_^")
复制代码
最佳答案
2020-8-31 14:55:28
jtxs0000 发表于 2020-8-31 14:42
这里打印的就是列表

我用的lxml,把car单独取出来,然后逐个遍历,对于ori_price为空的你可以做一个判断。
然后组成data,写到xlsx里。

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     url = 'https://www.che168.com/china/a0_0msdgscncgpi1ltocsp1exx0/?pvareaid=102179#currengpostion'
  5.     headers = {'user-agent': 'firefox'}
  6.     r = requests.get(url, headers=headers)
  7.     html = etree.HTML(r.text)
  8.     result = html.xpath('//a[@class="carinfo"]')
  9.     for item in result:
  10.         name = item.xpath('./div[2]/h4/text()')
  11.         milage = item.xpath('./div[2]/p/text()')
  12.         ori_price = item.xpath('./div[2]/div/s/text()')
  13.         cur_price = item.xpath('./div[2]/div/span[1]/em/text()')
  14.         print(name, milage, ori_price, cur_price)


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

使用道具 举报

 楼主| 发表于 2020-8-31 14:28:07 | 显示全部楼层
这贴沉了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 14:29:18 | 显示全部楼层
本帖最后由 suchocolate 于 2020-8-31 14:35 编辑

先占个位。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 14:32:37 | 显示全部楼层
suchocolate 发表于 2020-8-31 14:29
第几页的哪个车没有二手价,我需要看一下页面。

时不时在更新的,有时候有时候会往后跳一点,我主要想解决的是当发现那里没有数据的时候我能不能直接跳过或者随便放点东西在里面填充一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 14:36:55 | 显示全部楼层
jtxs0000 发表于 2020-8-31 14:32
时不时在更新的,有时候有时候会往后跳一点,我主要想解决的是当发现那里没有数据的时候我能不能直接跳过 ...

看到了,有的没有原价。这个可能得换一种思路了。
把每个车的info分支提取出来,做一个列表,我帮你写写看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 14:41:57 | 显示全部楼层
suchocolate 发表于 2020-8-31 14:36
看到了,有的没有原价。这个可能得换一种思路了。
把每个车的info分支提取出来,做一个列表,我帮你写写 ...
  1. headers = {
  2.     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3760.400 QQBrowser/10.5.4083.400'
  3. }
  4. url = "https://www.che168.com/china/a0_0msdgscncgpi1ltocsp2exx0/?pvareaid=102179#currengpostion"
  5. r = requests.get(url, headers=headers).text
  6.     html = parsel.Selector(r)
  7.    
  8.     # 车辆名称
  9.     name = html.xpath('//div[@class="cards-bottom"]/h4/text()').getall()

  10.     # 里程数
  11.     milage = html.xpath('//div[@class="cards-bottom"]/p/text()').getall()
  12.     print(milage)

  13.     # 现价
  14.     price = html.xpath('//div[@class="cards-price-box"]/span/em/text()').getall()

  15.     print(price)

  16.     # 原价
  17.     new_price = html.xpath('//div[@class="cards-price-box"]/s/text()').getall()
  18.     print(new_price)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 14:42:51 | 显示全部楼层
suchocolate 发表于 2020-8-31 14:36
看到了,有的没有原价。这个可能得换一种思路了。
把每个车的info分支提取出来,做一个列表,我帮你写写 ...

这里打印的就是列表
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 14:50:47 | 显示全部楼层
jtxs0000 发表于 2020-8-31 14:42
这里打印的就是列表

你这里一下子就getall获取全部了,一个列表,还不会留空,不好操作的,试试看能不能挨个获取内容,然后再添加进空列表,这样如果获取不到,就用if判断,获取不到的用其他内容替换
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-31 14:55:28 | 显示全部楼层    本楼为最佳答案   
jtxs0000 发表于 2020-8-31 14:42
这里打印的就是列表

我用的lxml,把car单独取出来,然后逐个遍历,对于ori_price为空的你可以做一个判断。
然后组成data,写到xlsx里。

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     url = 'https://www.che168.com/china/a0_0msdgscncgpi1ltocsp1exx0/?pvareaid=102179#currengpostion'
  5.     headers = {'user-agent': 'firefox'}
  6.     r = requests.get(url, headers=headers)
  7.     html = etree.HTML(r.text)
  8.     result = html.xpath('//a[@class="carinfo"]')
  9.     for item in result:
  10.         name = item.xpath('./div[2]/h4/text()')
  11.         milage = item.xpath('./div[2]/p/text()')
  12.         ori_price = item.xpath('./div[2]/div/s/text()')
  13.         cur_price = item.xpath('./div[2]/div/span[1]/em/text()')
  14.         print(name, milage, ori_price, cur_price)


  15. if __name__ == '__main__':
  16.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 15:04:22 | 显示全部楼层
suchocolate 发表于 2020-8-31 14:55
我用的lxml,把car单独取出来,然后逐个遍历,对于ori_price为空的你可以做一个判断。
然后组成data,写 ...

谢谢大佬了,就是判断那里卡住了,试了很多方法就是会报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-26 11:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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