经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python爬虫实战系列1:博客园cnblogs热门新闻采集
来源:cnblogs  作者:Python魔法师  时间:2024/3/13 9:15:10  对本文有异议

实战案例:博客园热门新闻采集

一、分析页面

打开博客园网址https://www.cnblogs.com/,点击【新闻】再点击【本周】

今日新闻.png

本次采集,我们以页面新闻标题为案例来采集。这里可以看到标题“ 李彦宏:以后不会存在“程序员”这种职业了”。

1.1、分析请求

F12打开开发者模式,然后点击Network后点击任意一个请求,Ctrl+F开启搜索,输入标题李彦宏:以后不会存在“程序员”这种职业了 ,开始搜索

请求分析.png

可以看到请求地址为https://news.cnblogs.com/n/digg?type=week 但是返回的内容不是json格式,而是html源码,说明该页面是博客园后端拼接html源码返回给前端的,这里我们就不能简单的直接通过API接口来获取数据了,还需要对html源码进行解析。

1.2、分析页面

点击查看元素,然后点击新闻标题。

页面源码.png

对应的html源码是<a href="/n/766062/" target="_blank">李彦宏:以后不会存在“程序员”这种职业了</a>

通过源码我们可以看出,标题是被一个id=news_list的div包裹,然后news_div下还有news_block这个div包裹,然后是逐级向下,一直到a标签才是我们想要的数据。

标题源码分析.png

1.3、分页信息处理

分页信息.png

通过页面分析,可以看到分页很简单,直接在Query String QueryParamters里传入type: week、page: 2两个参数即可。

1.4、判断反爬及cookie

如何判断该请求需要哪些header和cookie参数?或者有没有反爬策略

copy_curl.png

首先拷贝curl,在另一台机器上运行,curl代码如下

curl代码.png

通过逐步删除代码中header参数来判断哪些是必要的参数,首先把cookie参数删除试试,发现可以获取到结果。由此判断,该网站没有设置cookie请求机制。

那就很简单了,直接发请求,解析html源码。

二、代码实现

新建Cnblogs类,并在init里设置默认header参数

  1. class Cnblogs:
  2. def __init__(self):
  3. self.headers = {
  4. 'authority': 'news.cnblogs.com',
  5. 'referer': 'https://news.cnblogs.com/n/digg?type=yesterday',
  6. 'user-agent': USERAGENT
  7. }

新建获取新闻get_news函数

  1. def get_news(self):
  2. result = []
  3. for i in range(1, 4):
  4. url = f'https://news.cnblogs.com/n/digg?type=today&page={i}'
  5. content = requests.get(url)
  6. html = etree.HTML(content.text)
  7. news_list = html.xpath('//*[@id="news_list"]/div[@class="news_block"]')
  8. for new in news_list:
  9. title = new.xpath('div[@class="content"]/h2[@class="news_entry"]/a/text()')
  10. push_date = new.xpath('div[@class="content"]/div[@class="entry_footer"]/span[@class="gray"]/text()')
  11. result.append({
  12. "news_title": str(title[0]),
  13. "news_date": str(push_date[0]),
  14. "source_en": spider_config['name_en'],
  15. "source_cn": spider_config['name_cn'],
  16. })
  17. return result

代码主要使用了requests和lxml两个库来实现

测试运行

  1. def main():
  2. cnblogs = Cnblogs()
  3. results = cnblogs.get_news()
  4. print(results)
  5. if __name__ == '__main__':
  6. main()

程序运行效果.png

完整代码

  1. # -*- coding: utf-8 -*-
  2. import os
  3. import sys
  4. import requests
  5. from lxml import etree
  6. opd = os.path.dirname
  7. curr_path = opd(os.path.realpath(__file__))
  8. proj_path = opd(opd(opd(curr_path)))
  9. sys.path.insert(0, proj_path)
  10. from app.utils.util_mysql import db
  11. from app.utils.util_print import Print
  12. from app.conf.conf_base import USERAGENT
  13. spider_config = {
  14. "name_en": "https://news.cnblogs.com",
  15. "name_cn": "博客园"
  16. }
  17. class Cnblogs:
  18. def __init__(self):
  19. self.headers = {
  20. 'authority': 'news.cnblogs.com',
  21. 'referer': 'https://news.cnblogs.com/n/digg?type=yesterday',
  22. 'user-agent': USERAGENT
  23. }
  24. def get_news(self):
  25. result = []
  26. for i in range(1, 4):
  27. url = f'https://news.cnblogs.com/n/digg?type=week&page={i}'
  28. content = requests.get(url)
  29. html = etree.HTML(content.text)
  30. news_list = html.xpath('//*[@id="news_list"]/div[@class="news_block"]')
  31. for new in news_list:
  32. title = new.xpath('div[@class="content"]/h2[@class="news_entry"]/a/text()')
  33. push_date = new.xpath('div[@class="content"]/div[@class="entry_footer"]/span[@class="gray"]/text()')
  34. result.append({
  35. "news_title": str(title[0]),
  36. "news_date": str(push_date[0]),
  37. "source_en": spider_config['name_en'],
  38. "source_cn": spider_config['name_cn'],
  39. })
  40. return result
  41. def main():
  42. cnblogs = Cnblogs()
  43. results = cnblogs.get_news()
  44. print(results)
  45. if __name__ == '__main__':
  46. main()

总结

通过以上代码,我们实现了采集博客园的功能。

本文章代码只做学习交流使用,作者不负责任何由此引起的法律责任。

各位看官,如对你有帮助欢迎点赞,收藏,转发,关注公众号【Python魔法师】获取更多Python魔法~

qrcode.jpg

原文链接:https://www.cnblogs.com/meet/p/18068015

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号