鱼C论坛

 找回密码
 立即注册
查看: 2332|回复: 7

[已解决](分析Ajax请求并抓取今日头条街拍美图)

[复制链接]
发表于 2017-10-31 20:12:30 | 显示全部楼层 |阅读模式

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

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

x
  1. import requests
  2. from urllib.parse import urlencode
  3. from requests.exceptions import RequestException
  4. import json
  5. from bs4 import BeautifulSoup
  6. import re
  7. from hashlib import md5
  8. import os

  9. def get_page_index(offset,keyword):
  10.     data = {
  11.         'offset':offset,
  12.         'format':'json',
  13.         'keyword':keyword,
  14.         'autoload':'true',
  15.         'count':'20',
  16.         'cur_tab':'3'
  17.         }
  18.     url = 'http://www.toutiao.com/search_content/?'+urlencode(data)
  19.     headers = {
  20.         'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
  21.     }
  22.     try:
  23.         response = requests.get(url,headers=headers)
  24.         if response.status_code == 200:
  25.             return response.text
  26.         return None
  27.     except RequestException:
  28.         print('请求索引出错')
  29.         return None

  30. def parse_page_index(html):
  31.     data = json.loads(html)
  32.     if data and 'data' in data.keys():
  33.         for item in data.get('data'):
  34.             yield item.get('article_url')
  35.             

  36. def get_page_detail(url):
  37.     try:
  38.         response = requests.get(url)
  39.         if response.status_code == 200:
  40.             return response.text
  41.         return None
  42.     except RequestException:
  43.         print('请求详情页出错',url)
  44.         return None
  45.    
  46. def parse_page_detail(html,url):
  47.     soup = BeautifulSoup(html,'lxml')
  48.     title = soup.select('title')[0].get_text()
  49.     print(title)
  50.     images_pattern = re.compile('gallery: (.*?),\n    siblingList',re.S)
  51.     result = re.search(images_pattern,html)
  52.     if result:
  53.         data = json.loads(result.group(1))
  54.         if data and 'sub_images' in data.keys():
  55.             sub_images = data.get('sub_images')
  56.             images = [item.get('url')for item in sub_images]
  57.             for image in images:download_image(image)
  58.             return{
  59.                 'title':title,
  60.                 'url': url,
  61.                 'images':images
  62.                 }
  63. def download_image(url):
  64.     try:
  65.         response = requests.get(url)
  66.         if response.status_code == 200:
  67.             save_image(response.content)
  68.             return None
  69.     except RequestException:  
  70.         print('请求图片出错',url)
  71.         return None
  72.         
  73. def save_image(content):
  74.     file_path = '{0}/{1}.{2}'.format('C:\Python34',md5(content).hexdigest(),'jpg')
  75.     if not os.path.exists(file_path):
  76.         with open(file_path,'wb') as f:
  77.             f.write(content)
  78.             f.close()
  79.    
  80.    

  81. def main():
  82.     html = get_page_index(0,'街拍')
  83.     for url in parse_page_index(html):
  84.         print(url)
  85.         html = get_page_detail(url)
  86.         if html:
  87.             result = parse_page_detail(html,url)
  88.         
  89.         
  90. if __name__ == '__main__':
  91.     main()
复制代码

为什么到下载图片的时候就报错,哪位大佬帮我开导开导
最佳答案
2017-11-3 00:52:23
都说了让单个的测试你的函数了

这样测试一下不就知道哪个函数出错了么
  1. def download_image(url):
  2.     try:
  3.         response = requests.get(url)
  4.         if response.status_code == 200:
  5.             print('get')
  6.     except RequestException:
  7.         print('请求图片出错',url)
  8.         return None

  9. if __name__ == '__main__':
  10.     download_image('//p3.pstatp.com/origin/3c7c0001ed84f784045c')
  11.     download_image('http://p3.pstatp.com/origin/3c7c0001ed84f784045c')
复制代码



测试结果

  1. 请求图片出错 //p3.pstatp.com/origin/3c7c0001ed84f784045c
  2. get
复制代码


能看出你错误的原因么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-10-31 21:40:28 | 显示全部楼层
file_path = '{0}/{1}.{2}'.format('C:\Python34',md5(content).hexdigest(),'jpg')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 11:15:07 | 显示全部楼层
你报错都不发,怎么查?
还有,你要是想知道哪个地方出了问题,你直接单独查每个函数的输出是不是正常不就能知道具体哪个地方出了问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-2 10:33:03 | 显示全部楼层
SixPy 发表于 2017-10-31 21:40
file_path = '{0}/{1}.{2}'.format('C:\Python34',md5(content).hexdigest(),'jpg')

是这里的保存路径出错了么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-2 10:43:45 | 显示全部楼层
gopythoner 发表于 2017-11-1 11:15
你报错都不发,怎么查?
还有,你要是想知道哪个地方出了问题,你直接单独查每个函数的输出是不是正常不就 ...

就是这样 ,是不是我的保存路径出错了
94a8279c609b612e54d43d5ac7a0ea4.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 11:49:47 | 显示全部楼层
梦想一事无成 发表于 2017-11-2 10:43
就是这样 ,是不是我的保存路径出错了

你复制一个图片地址,放到浏览器中,看看能打开么?
如果不能,那你找的链接是错误的,或者说,链接不完整,需要构造完整
如果能,但是你请求不是200,那有可能是图片有防盗链,需要在请求头中加入更多的信息,不单纯是user-agent这种
一般请求图片都需要考虑防盗链这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-2 12:00:31 | 显示全部楼层
gopythoner 发表于 2017-11-2 11:49
你复制一个图片地址,放到浏览器中,看看能打开么?
如果不能,那你找的链接是错误的,或者说,链接不完 ...


//p3.pstatp.com/origin/3c7c0001ed84f784045c
我随便点开一个链接可以浏览器上点开,但是好像url缺少了http:
这里不我的状态码应该是200 ,不然就返回的应该是None
麻烦请把我运行下代码帮我调试下可以嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-3 00:52:23 | 显示全部楼层    本楼为最佳答案   
都说了让单个的测试你的函数了

这样测试一下不就知道哪个函数出错了么
  1. def download_image(url):
  2.     try:
  3.         response = requests.get(url)
  4.         if response.status_code == 200:
  5.             print('get')
  6.     except RequestException:
  7.         print('请求图片出错',url)
  8.         return None

  9. if __name__ == '__main__':
  10.     download_image('//p3.pstatp.com/origin/3c7c0001ed84f784045c')
  11.     download_image('http://p3.pstatp.com/origin/3c7c0001ed84f784045c')
复制代码



测试结果

  1. 请求图片出错 //p3.pstatp.com/origin/3c7c0001ed84f784045c
  2. get
复制代码


能看出你错误的原因么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-3 14:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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