设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 212|回复: 11
收起左侧

python获取知乎文章数据

[复制链接]
发表于 2022-6-20 16:45:55 | 显示全部楼层 |阅读模式
今天我们分享下用Python爬取知乎前100用户的数据,选择对象是知乎排行榜前100用户,各自按访问量从高到低排序爬取他们个人主页的所有文章数据,包括赞同数、收藏数、标题等等,使用一些简单的数据分析手段看看技术。
首先我们打开知乎的个人主页,利用requests分析下网站,简单的分析后发现单纯的访问不带cookie返回的是空页面,而且多次访问后会被封IP,所以我们需要获取数据爬虫程序里面就需要添加上cookie和代理IP,最好是ua一起加上。代理的选择这里推荐亿牛云爬虫代理IP,IP池大,延迟低,速度快,对于有一定反爬机制的网站是最好的选择。访问过知乎的都知道,是需要先登录才能看到内容的,所以这里我们选择使用Selenium模拟浏览器的方式进行登录操作。在获取数据过程加上代理获取数据的实现过程如下:
  1. from selenium import webdriver
  2.     import string
  3.     import zipfile

  4.     # 代理服务器(产品官网 www.16yun.cn)
  5.     proxyHost = "t.16yun.cn"
  6.     proxyPort = "3111"

  7.     # 代理验证信息
  8.     proxyUser = "username"
  9.     proxyPass = "password"


  10.     def create_proxy_auth_extension(proxy_host, proxy_port,
  11.                                     proxy_username, proxy_password,
  12.                                     scheme='http', plugin_path=None):
  13.         if plugin_path is None:
  14.             plugin_path = r'/tmp/{}_{}@t.16yun.zip'.format(proxy_username, proxy_password)

  15.         manifest_json = """
  16.         {
  17.             "version": "1.0.0",
  18.             "manifest_version": 2,
  19.             "name": "16YUN Proxy",
  20.             "permissions": [
  21.                 "proxy",
  22.                 "tabs",
  23.                 "unlimitedStorage",
  24.                 "storage",
  25.                 "<all_urls>",
  26.                 "webRequest",
  27.                 "webRequestBlocking"
  28.             ],
  29.             "background": {
  30.                 "scripts": ["background.js"]
  31.             },
  32.             "minimum_chrome_version":"22.0.0"
  33.         }
  34.         """

  35.         background_js = string.Template(
  36.             """
  37.             var config = {
  38.                 mode: "fixed_servers",
  39.                 rules: {
  40.                     singleProxy: {
  41.                         scheme: "${scheme}",
  42.                         host: "${host}",
  43.                         port: parseInt(${port})
  44.                     },
  45.                     bypassList: ["localhost"]
  46.                 }
  47.               };

  48.             chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

  49.             function callbackFn(details) {
  50.                 return {
  51.                     authCredentials: {
  52.                         username: "${username}",
  53.                         password: "${password}"
  54.                     }
  55.                 };
  56.             }

  57.             chrome.webRequest.onAuthRequired.addListener(
  58.                 callbackFn,
  59.                 {urls: ["<all_urls>"]},
  60.                 ['blocking']
  61.             );
  62.             """
  63.         ).substitute(
  64.             host=proxy_host,
  65.             port=proxy_port,
  66.             username=proxy_username,
  67.             password=proxy_password,
  68.             scheme=scheme,
  69.         )
  70.         print(background_js)

  71.         with zipfile.ZipFile(plugin_path, 'w') as zp:
  72.             zp.writestr("manifest.json", manifest_json)
  73.             zp.writestr("background.js", background_js)

  74.         return plugin_path


  75.     proxy_auth_plugin_path = create_proxy_auth_extension(
  76.         proxy_host=proxyHost,
  77.         proxy_port=proxyPort,
  78.         proxy_username=proxyUser,
  79.         proxy_password=proxyPass)

  80.     option = webdriver.ChromeOptions()

  81.     option.add_argument("--start-maximized")

  82.     # 如报错 chrome-extensions
  83.     # option.add_argument("--disable-extensions")

  84.     option.add_extension(proxy_auth_plugin_path)

  85.     # 关闭webdriver的一些标志
  86.     # option.add_experimental_option('excludeSwitches', ['enable-automation'])

  87.     driver = webdriver.Chrome(
  88.         chrome_options=option,
  89.         executable_path="./chromdriver"
  90.     )

  91.     # 修改webdriver get属性
  92.     # script = '''
  93.     # Object.defineProperty(navigator, 'webdriver', {
  94.     # get: () => undefined
  95.     # })
  96.     # '''
  97.     # driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})


  98.     driver.get("https://httpbin.org/ip")
复制代码



发表于 2022-6-23 15:36:40 | 显示全部楼层
1123123123
沙发 2022-6-23 15:36:40 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2022-6-24 09:35:37 | 显示全部楼层
123123123uu
板凳 2022-6-24 09:35:37 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2022-8-20 12:31:45 | 显示全部楼层
12312321312312321321
6# 2022-8-20 12:31:45 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2022-8-24 12:13:31 | 显示全部楼层
123123123123
7# 2022-8-24 12:13:31 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2022-8-25 12:19:06 | 显示全部楼层
12312312312
8# 2022-8-25 12:19:06 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-1-26 15:38 , Processed in 0.061891 second(s), 11 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

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