(点击上方公众号,可快速关注一起学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届有机硅精细化学品技术交流会! |