8.22爬虫笔记4

爬取今日头条图集 进入今日头条首页:https://www.toutiao.com/

      步骤:1、查看网页,查找我们需要的URL,分析URL

                 2、获取网页内容,分析内容

                 3、定位我们需要的内容

                 4、将数据存储

在搜素框 输入要搜索的内容(例如:街拍),然后选择图集,F12检查,查看Ajax请求:

第一次Ajax请求:

再往下拉,触发第二次、第三次Ajax请求:(下图第二次Ajax请求)

分析URL后发现发现规律只有offset不同(第一次offset=0,第二次offset=20,第三次offset=40、、),其他内容都相同,此时我们得到了当前页面的所有图片文章的URL(每条只可以看到四张,但是里面本应该有8张,如下图一),但是我们得不到具体一个里面的所有图片。故我们需要再进去此URL,再去分析具体一篇图片文章的所有图片URL(下图二)。

然后我们再分析get请求的Response,我们去分析返回值,查找出每张图片的URL,如下图我们找出了图片对应的URL路径:

所有的分析到这里就结束了,接下来就是代码实现。

完整代码如下:

 
  1. import re

  2. import requests

  3. import json

  4. import os

  5. from urllib import request

  6.  
  7. filename = 'Download'

  8. if not os.path.exists(filename):

  9. os.mkdir(filename) # 新建文件夹用于存放图片

  10. i = 0

  11. strdes = 0

  12. offset = 20

  13. while i < 10:

  14. headers = {

  15. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',

  16. }

  17. # 第一层 url

  18. url = 'https://www.toutiao.com/search_content/?offset={}&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=3&from=gallery'.format(str(offset*i))

  19. response = requests.get(url, headers=headers)

  20. res_dict = response.json()

  21. # print(res_dict)

  22. # address_url =

  23. res_dict_data = res_dict['data']

  24. # print(res_dict_data)

  25. # print(type(res_dict_data))

  26. for url_dict in res_dict_data:

  27. # 获取到的第二层url

  28. url = url_dict['article_url']

  29. print(url)

  30.  
  31. response = requests.get(url, headers=headers)

  32. info = response.text

  33.  
  34. re_m = r'gallery: JSON\.parse\((.*)\),'

  35. msg = re.search(re_m, info)

  36. if msg == None:

  37. break

  38. msg_info = msg.group(1)

  39.  
  40.  
  41.  
  42. msg_str = json.loads(msg_info)

  43. msg_dict = json.loads(msg_str)

  44. # print(msg_dict)

  45. info_msg = msg_dict['sub_images']

  46. for j in info_msg:

  47. images_url = j['url']

  48. # print(images_url)

  49. # img_name = filename + '/' + images_url.split('/')[-1] + '.jpg'

  50.  
  51. img_name = filename + '/' + str(strdes) + '.jpg'

  52. strdes += 1

  53.  
  54. print(img_name)

  55. request.urlretrieve(images_url, img_name)

  56.  
  57. i = i + 1

猜你喜欢

转载自blog.csdn.net/Lujuntong/article/details/81949397