当前位置:   article > 正文

Python的Requests来爬取今日头条的图片和文章_cookie池维护

cookie池维护

实现代码

Python的Requests来爬取今日头条的图片和文章并且存入mongo

config.py 

  1. MONGO_HOST = 'localhost'
  2. MONGO_PORT = 27017
  3. MONGO_DB = 'toutiao'
  4. MONGO_TABLE = 'toutiao'
  5. GROUP_START = 1
  6. GROUP_END = 20
  7. KEYWORD = '原油'
'
运行

 toutiao.py

  1. import json
  2. import os
  3. from urllib.parse import urlencode
  4. import pymongo
  5. import requests
  6. from multiprocessing import Pool
  7. from requests.exceptions import ConnectionError
  8. from hashlib import md5
  9. from config import *
  10. client = pymongo.MongoClient(MONGO_HOST, MONGO_PORT)
  11. db = client[MONGO_DB]
  12. def get_page_index(offset, keyword):
  13. data = {
  14. 'autoload': 'true',
  15. 'count': 20,
  16. 'cur_tab': 1,
  17. 'app_name': 'web_search',
  18. 'format': 'search_tab',
  19. 'keyword': keyword,
  20. 'offset': offset,
  21. }
  22. params = urlencode(data)
  23. base = 'https://www.toutiao.com/api/search/content'
  24. url = base + '?' + params
  25. try:
  26. response = requests.get(url)
  27. if response.status_code == 200:
  28. data = json.loads(response.text)
  29. if data and 'data' in data.keys():
  30. if data.get('data') is not None:
  31. for item in data.get('data'):
  32. if item is not None:
  33. yield [item.get('article_url'), item.get('abstract'), item.get('large_image_url')]
  34. except ConnectionError:
  35. print('Error occurred')
  36. return None
  37. def download_image(url):
  38. print('Downloading', url)
  39. try:
  40. response = requests.get(url)
  41. if response.status_code == 200:
  42. save_image(response.content)
  43. return None
  44. except Exception:
  45. return None
  46. def save_image(content):
  47. file_path = '{0}/picture/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg')
  48. print(file_path)
  49. if not os.path.exists(file_path):
  50. with open(file_path, 'wb') as f:
  51. f.write(content)
  52. f.close()
  53. def save_to_mongo(result):
  54. if db[MONGO_TABLE].insert_one(result):
  55. print('Successfully Saved to Mongo', result)
  56. return True
  57. return False
  58. def main(offset):
  59. items = get_page_index(offset, KEYWORD)
  60. for item in items:
  61. if (item[2] is not None) and len(item[2])!=0:
  62. download_image(item[2])
  63. if (item[0] is not None and len(item[0]) != 0)\
  64. or (item[1] is not None and len(item[1]) != 0)\
  65. or (item[2] is not None and len(item[2]) != 0):
  66. json = {
  67. 'article_url': item[0],
  68. 'abstract': item[1],
  69. 'large_image_url': item[2]
  70. }
  71. save_to_mongo(json)
  72. if __name__ == '__main__':
  73. pool = Pool()
  74. groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])
  75. pool.map(main, groups)
  76. pool.close()
  77. pool.join()

知识拓展

一、用Flask+Redis维护Cookies池

为什什么要⽤用Cookies池

⽹网站需要登录才可爬取,例例如新浪微博

爬取过程中如果频率过⾼高会导致封号

需要维护多个账号的Cookies池实现⼤大规模爬取

Cookies池的要求

⾃自动登录更更新

定时验证筛选

提供外部接⼝口

代码:GitHub - Python3WebSpider/CookiesPool: Cookies Pool

二、用Flask+Redis维护代理池

为什么要⽤用代理理池?

许多⽹网站有专⻔门的反爬⾍虫措施,可能遇到封IP等问题。

互联⽹网上公开了了⼤大量量免费代理理,利利⽤用好资源。

通过定时的检测维护同样可以得到多个可⽤用代理理。

代理理池的要求

多站抓取,异步检测

定时筛选,持续更更新

提供接⼝口,易易于提取

代码

GitHub - Python3WebSpider/ProxyPool: An Efficient ProxyPool with Getter, Tester and Server

三、VirtualEnv

Virtualenv他最大的好处是,可以让每一个python项目单独使用一个环境,而不会影响python系统环境,也不会影响其他项目的环境。

安装,virtualenv本质上是个python包, 使用pip安装:

pip install virtualenv

在工作目录下创建虚拟环境(默认在当前目录):注意需要自定义虚拟环境的名字!

  1. ~$virtualenv TestEnv
  2. New python executable in ~/TestEnv/bin/python
  3. Installing setuptools, pip, wheel...done.

默认情况下, 虚拟环境中不包括系统的site-packages, 若要使用请添加参数:

语法:virtualenv --system-site-packages TestEnv

使用virtualenv默认python版本创建虚拟环境

语法:virtualenv --no-site-packages ubuntu_env

四、url去重策略

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/958696
推荐阅读
相关标签
  

闽ICP备14008679号