Python 爬取CSDN的极客头条

工具

  • Python

  • Python:requests

  • Python:BeautifulSoup

分析

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

因此,我们可以通过 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


class CS:
    def __init__(self):
        # self.username = username
        pass

    def geek(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)

项目地址: 模拟京东登录

吐槽QQ群: 173318043


IMyxuan
335 声望17 粉丝

小墨鱼