(点击上方公众号,可快速关注一起学Python)
来源:IMyxuan 链接:
https://segmentfault.com/a/1190000012124539
如有好Python相关文章欢迎投稿至lansebolang2008@163.com
原创转载均可,转载稿请获取作者授权转载
工具
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
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的14张思维导图
看完本文有收获?请转发分享给更多人
关注「Python那些事」,做全栈开发工程师
上一篇:白帽子的辛酸谁能懂? 下一篇:【优惠剩余4天】瓦克、白云、美适雅、新展、汉高等有机硅名企纷纷相约第25届有机硅精细化学品技术交流会! |