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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。