鱼C论坛

 找回密码
 立即注册
查看: 1866|回复: 5

[已解决]爬妹子图求解

[复制链接]
发表于 2021-1-13 22:13:45 | 显示全部楼层 |阅读模式

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

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

x
  1. import requests,json
  2. from lxml import etree


  3. def gethtml(url):
  4.    
  5.     headers={
  6.     "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
  7.     "Cookie":"",        
  8.     "Referer":"https://www.mzitu.com/217910/40",
  9.     }
  10.     r=requests.get(url,headers=headers)     
  11.     if r.status_code !=200:                 
  12.         print("获取url:%s失败!"%(url))
  13.         exit()
  14.     return r                           



  15. def getxpath(r,str):
  16.     html = etree.HTML(r.text)
  17.     reslist = html.xpath(str)
  18.     return reslist



  19. def writetxt(txtpath,data_str):                              
  20.     with open(txtpath, "w") as f:
  21.         f.write(str(data_str))


  22. def writeimg(imgpath,content):        
  23.     with open(imgpath, "wb") as f:
  24.         f.write(content)

  25. def get_mezitu():
  26.     url='https://www.mzitu.com/217910/40'
  27.     r=gethtml(url)
  28.     mezitu_url_list=getxpath(r,'img/html/body/div[2]/div[1]/div[3]/p/a/img/@src')
  29.     mezitu_url=mezitu_url_list[0]
  30.     mezitu_url="https:"+mezitu_url
  31.     r=gethtml(mezitu_url)
  32.     writeimg('./妹子jpg.png',r.content)
  33.     print('恭喜爬到图片')
  34.    
  35. if __name__ == '__main__':

  36.     get_mezitu()
  37.     print('恭喜')
复制代码
下面是报错信息,求大神告诉如何修改。
  1. Traceback (most recent call last):
  2.   File "D:/桌面图标文件目录/妹子图.py", line 48, in <module>
  3.     get_mezitu()
  4.   File "D:/桌面图标文件目录/妹子图.py", line 40, in get_mezitu
  5.     mezitu_url=mezitu_url_list[0]
  6. IndexError: list index out of range
  7. >>>
复制代码


最佳答案
2021-1-13 22:57:18
别纠结了。你这个很显然是解析网页数据的时候出现了问题,可能是模块问题,也可能是你用法错了
最简单的还是建议换方式吧。现在爬虫用的比较多的是requests,BeautifulSoup模块,和lxml解析器

模块导入:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. # lxml解析器不需要导入
复制代码

获取网页文本可以这么写:
  1. def getHTMLText(url):
  2.     try:
  3.         res = requests.get(url, timeout=30)
  4.         res.raise_for_status()  # 如果状态不是200,即未成功获得数据则抛出异常
  5.         res.encoding = res.apparent_encoding  # 用备用编码解码数据
  6.         return res.text
  7.     except:
  8.         return '爬取异常,异常url:' + url
复制代码

解析可以用:
  1. soup = BeautifulSoup(res.text,'lxml')
  2. temp = soup.select('dd > a') # 函数筛选
  3. # 或者用的比较多的正则
  4. id = re.find_all('"ID":"(.*?)","', res.text)  # 正则表达式
  5. soup.find_all(‘div’,class_=’item’)  # BeautifulSoup查找
  6. # 或者直接获取属性
  7. soup.a.attrs
复制代码

这都是当下用的最多最常见的,用的人多了应该就比较稳定了吧,强烈建议试试
你用的这么冷门的,也查不到什么资料,可能很多人也和我一样根本没用过你用的方法
就没法给你解答了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-13 22:22:40 | 显示全部楼层
  1. mezitu_url_list=getxpath(r,'img/html/body/div[2]/div[1]/div[3]/p/a/img/@src')
复制代码

你的这种爬虫我也看不懂,但是是这里出了问题,导致mezitu_url_list是一个空列表,所以超出限制
你检查一下你的getxpath函数吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-13 22:54:56 | 显示全部楼层
小甲鱼的铁粉 发表于 2021-1-13 22:22
你的这种爬虫我也看不懂,但是是这里出了问题,导致mezitu_url_list是一个空列表,所以超出限制
你检查 ...

copy xpath 的路径是        /html/body/div[2]/div[1]/div[3]/p/a/img   这里要如何写?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 22:57:18 | 显示全部楼层    本楼为最佳答案   
别纠结了。你这个很显然是解析网页数据的时候出现了问题,可能是模块问题,也可能是你用法错了
最简单的还是建议换方式吧。现在爬虫用的比较多的是requests,BeautifulSoup模块,和lxml解析器

模块导入:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. # lxml解析器不需要导入
复制代码

获取网页文本可以这么写:
  1. def getHTMLText(url):
  2.     try:
  3.         res = requests.get(url, timeout=30)
  4.         res.raise_for_status()  # 如果状态不是200,即未成功获得数据则抛出异常
  5.         res.encoding = res.apparent_encoding  # 用备用编码解码数据
  6.         return res.text
  7.     except:
  8.         return '爬取异常,异常url:' + url
复制代码

解析可以用:
  1. soup = BeautifulSoup(res.text,'lxml')
  2. temp = soup.select('dd > a') # 函数筛选
  3. # 或者用的比较多的正则
  4. id = re.find_all('"ID":"(.*?)","', res.text)  # 正则表达式
  5. soup.find_all(‘div’,class_=’item’)  # BeautifulSoup查找
  6. # 或者直接获取属性
  7. soup.a.attrs
复制代码

这都是当下用的最多最常见的,用的人多了应该就比较稳定了吧,强烈建议试试
你用的这么冷门的,也查不到什么资料,可能很多人也和我一样根本没用过你用的方法
就没法给你解答了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-13 22:59:58 | 显示全部楼层
笨鸟学飞 发表于 2021-1-13 22:57
别纠结了。你这个很显然是解析网页数据的时候出现了问题,可能是模块问题,也可能是你用法错了
最简单的还 ...

感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 23:21:42 | 显示全部楼层
随便写了个代码,凑合看看吧
  1. import requests
  2. from bs4 import BeautifulSoup


  3. def getHTMLtext(url):
  4.     i = 0
  5.     headers = {
  6.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
  7.     }
  8.     try:
  9.         res = requests.get(url, headers=headers)
  10.         res.raise_for_status()
  11.         res.encoding = res.apparent_encoding
  12.         return res.text
  13.     except:
  14.         i += 1
  15.         print('第%d次爬取失败!正在重试···' % i)
  16.         getHTMLtext(url)


  17. def main():
  18.     url = 'https://www.mzitu.com/217910/40'
  19.     html = getHTMLtext(url)
  20.     soup = BeautifulSoup(html,'lxml')
  21.     jpg = soup.find_all('img', class_='blur')
  22.     jpg = jpg[0].get('src')
  23.     print(jpg)


  24. if __name__ == '__main__':
  25.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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