去评论
dz插件网

Python 爬取CSDN的极客头条

独家记忆
2024/10/10 21:43:50
(点击上方公众号,可快速关注一起学Python)


来源:IMyxuan    链接:

https://segmentfault.com/a/1190000012124539

如有好Python相关文章欢迎投稿至lansebolang2008@163.com

原创转载均可,转载稿请获取作者授权转载


工具



分析

使用浏览器调试面板分析网页结构以及网络请求,容易知道,每一个头条信息结构如图所示



因此,我们可以通过 dd.tracking-ad > span > a定位元素,同时,根据Network面板的网络请求分析,第一次加载更多数据的请求为
http://geek.csdn.net/service/news/get_news_list?from=-&size=20&type=HackCount
第二次的为:
http://geek.csdn.net/service/news/get_news_list?from=6:245113&size=20&type=HackCount

上述请求已精简,删除了原有请求的部分参数

也就是说,初始加载更多数据的时候,from参数为-,后续的请求,from是前一次请求所返回来的值,因此,我们可以用Python爬取数据了

代码
# -*- coding: UTF-8 -*-
from bs4 import BeautifulSoup
import requests
import time

classCS:
   def__init__(self):
       # self.username = username
       pass

   defgeek(self, _from=None, type='HackCount', size=20):
       """
       url: http://geek.csdn.net/,
       more: http://geek.csdn.net/service/news/get_news_list?from=-&size=20&type=HackCount
       :param _from: 加载更多的时候的标志
       :param type: 极客头条的类型
       :param size: 每页的数目
       :return:
       """
       start = '-'
       if _from:
           timestamp = int(time.time())
           url = 'http://geek.csdn.net/service/news/get_news_list?' \
                 'from=%s&size=%d&type=%s&_=%d' % (_from, size, type, timestamp)
           req = requests.get(url)
           js = req.json()
           start = js['from']
           soup = BeautifulSoup(js['html'], 'lxml')
       else:
           url = 'http://geek.csdn.net/'
           req = requests.get(url)
           soup = BeautifulSoup(req.content, 'lxml')
       results = soup.select('dd.tracking-ad > span > a')
       items = []
       for result in results:
           item = {
               'href': result['href'],
               'title': result.string
           }
           items.append(item)
       return {
           'from': start,
           'items': items
       }

cs = CS()
items = []
_from = ''
i = 0
# 这里控制获取多少页的内容
while i < 10:
   result = cs.geek(_from=_from)
   items.extend(result['items'])
   _from = result['from']
   i = i + 1
print(items)


推荐阅读



看完本文有收获?请转发分享给更多人

关注「Python那些事」,做全栈开发工程师