资讯专栏INFORMATION COLUMN

Python 爬取CSDN的极客头条

CatalpaFlat / 3312人阅读

摘要:爬取的极客头条工具分析使用浏览器调试面板分析网页结构以及网络请求,容易知道,每一个头条信息结构如图所示因此,我们可以通过定位元素,同时,根据面板的网络请求分析,第一次加载更多数据的请求为第二次的为上述请求已精简,删除了原有请求的部分参数

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44480.html

相关文章

  • 16个帮助开发者成长的技术社区

    摘要:掘金网址掘金是一个帮助开发者成长的社区,是给开发者用的,给设计师用的,和给产品经理用的。就是一个以讨论服务器数据库等技术为主的自由开放的技术社区。网址社区为国内最大最具影响力的开源技术社区,致力于的技术研究。 1.StackOverflow网址:https://stackoverflow.com/Stack Overflow是最受程序员欢迎的IT技术问答网站,而且也是内容最丰富的社区之...

    JerryZou 评论0 收藏0
  • 16个帮助开发者成长的技术社区

    摘要:掘金网址掘金是一个帮助开发者成长的社区,是给开发者用的,给设计师用的,和给产品经理用的。就是一个以讨论服务器数据库等技术为主的自由开放的技术社区。网址社区为国内最大最具影响力的开源技术社区,致力于的技术研究。 1.StackOverflow网址:https://stackoverflow.com/Stack Overflow是最受程序员欢迎的IT技术问答网站,而且也是内容最丰富的社区之...

    Integ 评论0 收藏0
  • 技术文章写作及运营的技巧:分析篇 | 什么样的文章受欢迎?

    摘要:值得注意的是,文章在微博上的传播时间比较短。由于我的粉丝数量还不是非常多,我只能从中挑选中阅读量最高的一篇文章。在自己的关注人数上升后,再转到这些问题上,要不会吃力不讨好。 对于以技术为核心的技术博客来说,人们是冲着他们需要的内容去的,绝大多数情况下都不是在闲逛。如果你的网站里没有他想要的东西的话,他便会离开,人们是出于目的去搜索,基于动机,而不是无聊的在闲逛。无聊的话,他们更多的会去...

    felix0913 评论0 收藏0

发表评论

0条评论

CatalpaFlat

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<