今日头条爬虫

今日头条是一个js动态加载的网站,尝试了两种方式爬取,一是页面直接提取,一是通过接口提取:

version1:直接页面提取

#coding=utf-8
#今日头条
from lxml import etree
import requests
import urllib2,urllib

def get_url():
    url = ‘https://www.toutiao.com/ch/news_hot/‘
    global count
    try:
        headers = {
        ‘Host‘: ‘www.toutiao.com‘,
        ‘User-Agent‘: ‘Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)‘,
        ‘Connection‘: ‘Keep-Alive‘,
        ‘Content-Type‘: ‘text/plain; Charset=UTF-8‘,
        ‘Accept‘: ‘*/*‘,
        ‘Accept-Language‘: ‘zh-cn‘,
        ‘cookie‘:‘__tasessionId=u690hhtp21501983729114;cp=59861769FA4FFE1‘}
        response = requests.get(url,headers = headers)
        print response.status_code
        html = response.content
        #print html
        tree = etree.HTML(html)
        title = tree.xpath(‘//a[@class="link title"]/text()‘)
        source = tree.xpath(‘//a[@class="lbtn source"]/text()‘)
        comment = tree.xpath(‘//a[@class="lbtn comment"]/text()‘)
        stime = tree.xpath(‘//span[@class="lbtn"]/text()‘)
        print len(title)   #0
        print type(title)  #<type ‘list‘>
        for x,y,z,q in zip(title,source,comment,stime):
            count += 1
            data = {
                ‘title‘:x.text,
                ‘source‘:y.text,
                ‘comment‘:z.text,
                ‘stime‘:q.text}
            print count,‘|‘,data

    except urllib2.URLError, e:
        print e.reason

if __name__ == ‘__main__‘:
    count = 0
    get_url()

问题:title = tree.xpath(‘//a[@class="link title"]/text()‘)提取内容失败,用xpath check插件提取成功

version2:通过接口提取

1.通过F12-network,查看?category=news_society&utm_source=toutiao&widen=1&max_behot_time=0&max_behot_time_tmp=0&tadrequire=true&as=A1B5093B4F12B65&cp=59BF52DB0655DE1的response

2.有效参数:

&category=news_society :头条类型,必填
&max_behot_time=0 &max_behot_time_tmp=0 :打开网页的时间(格林威治秒)和时间戳
&as=A1B5093B4F12B65&cp=59BF52DB0655DE1  :as和cp是用来提取和验证访问者页面停留时间的参数,cp对浏览器的时间进行了加密混淆,as通过md5来对时间进行验证

import requests
import json

url = ‘http://www.toutiao.com/api/pc/feed/?category=news_society&utm_source=toutiao&widen=1&max_behot_time=0&max_behot_time_tmp=0&tadrequire=true&as=A1B5093B4F12B65&cp=59BF52DB0655DE1‘
resp = requests.get(url)
print  resp.status_code    

Jdata = json.loads(resp.text)
#print Jdata
news = Jdata[‘data‘]

for n in news:
    title = n[‘title‘]    source = n[‘source‘]    groupID = n[‘group_id‘]    print title,‘|‘,source,‘|‘,groupID

注:只爬取了7条数据

关于as和cp参数,有大神研究如下:

1.找到js代码,直接crtl+f 找as和cp关键字

function(t) {
    var e = {};
    e.getHoney = function() {
        var t = Math.floor((new Date).getTime() / 1e3),
            e = t.toString(16).toUpperCase(),
            i = md5(t).toString().toUpperCase();
        if (8 != e.length) return {
            as: "479BB4B7254C150",
            cp: "7E0AC8874BB0985"
        };
        for (var n = i.slice(0, 5), a = i.slice(-5), s = "", o = 0; 5 > o; o++) s += n[o] + e[o];
        for (var r = "", c = 0; 5 > c; c++) r += e[c + 3] + a[c];
        return {
            as: "A1" + s + e.slice(-3),
            cp: e.slice(0, 3) + r + "E1"
        }
    },

2.模拟as和cp参数:

import time
import hashlib 

def get_as_cp():
    zz ={}
    now = round(time.time())
    print now  #获取计算机时间
    e = hex(int(now)).upper()[2:]  #hex()转换一个整数对象为十六进制的字符串表示
    print e
    i = hashlib.md5(str(int(now))).hexdigest().upper() #hashlib.md5().hexdigest()创建hash对象并返回16进制结果
    if len(e)!=8:
        zz = {‘as‘: "479BB4B7254C150",
            ‘cp‘: "7E0AC8874BB0985"}
        return zz
    n=i[:5]
    a=i[-5:]
    r = ""
    s = ""
    for i in range(5):
        s = s+n[i]+e[i]
    for j in range(5):
        r = r+e[j+3]+a[j]
    zz = {
            ‘as‘: "A1" + s + e[-3:],
            ‘cp‘: e[0:3] + r + "E1"
        }
    print zz

if __name__ == "__main__":
    get_as_cp()
时间: 2024-12-22 02:27:00

今日头条爬虫的相关文章

使用mitmproxy做今日头条爬虫链接分析

import pickle import chardet from mitmproxy import ctx from pprint import pprint heads_file = 'header.txt' body_file = 'body.txt' #mitmdump -s test.py # Dalvik/2.1.0 (Linux; U; Android 8.1.0; MI 8 MIUI/8.8.31) def request(flow): #只是修改请求浏览器请求头为MitmPro

Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)

整理了一下网易云歌曲评论抓取.分析好友信息抓取.淘宝宝贝抓取.今日头条美图抓取的一些代码 抓取网易云评论 进入歌曲界面: http://music.163.com/#/song?id=453185824 找到如下的数据源: 贴一段Lyrichu的代码: (运行环境为P2.7) # -*- coding: utf-8 -*-# @Time : 2017/3/28 8:46# @Author : Lyrichu# @Email : [email protected]# @File : NetClou

爬虫实战【7】Ajax解析续-今日头条图片下载

昨天我们分析了今日头条搜索得到的信息,一直对图集感兴趣的我还是选择将所有的图片下载下来. 我们继续讲一下如何通过各个图集的url得到每个图集下面的照片. 分析图集的组成 [插入图片,某个图集的页面] 我们看上面的这个图片,右面的1/5可以看出,这个图集有5张图片,在图片上右侧点击的话,会打开下一张图片. 我们来看一下这些图片的url在哪里? 分析图集的源代码 [插入图片,图集页的XHR信息] 我们先看一下XHR,返回的仍然是一些json信息,但是每个json里面的内容都不是我们需要的图片的url

使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)

爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 得到了今日头条的推荐新闻的接口地址:https://www.toutiao.com/api/pc/focus/ 单独访问这个地址得到 此接口得到的数据格式为json数据 我们用scrapy+selenium+PhantomJS的方式获取今日头条推荐的内容 下面是是scrapy中最核心的代码,位于s

【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 准备工作在本节开始之前,请确保已经安装好requests库.如果没有安装,可以参考第1章.另外如果你对python的库不是很熟的话,建议先去小编的Python交流.裙 :一久武其而而流

用今日头条的方法推荐公开课

做了个APP,名字很土,叫<学啥>.用今日头条的方法推荐公开课.服务端是阿里云CentOS7+Play!+Scala+Docker+Appache Mahout, 爬虫是Scrapy,做了安卓客户端和简易的iOS客户端.代码开源在:https://github.com/foamliu/hackathon-ocw 下边是服务端框架,客户端通过REST API与服务端通信,服务端为用户推荐适合的公开课视频,后台定时任务负责训练模型. 安卓的效果是这样滴: 现在有空时我可以用它来学点东西,但还是很多

Python爬取今日头条段子

刚入门Python爬虫,试了下爬取今日头条官网中的段子,网址为https://www.toutiao.com/ch/essay_joke/源码比较简陋,如下: 1 import requests 2 import json 3 res = requests.get('https://www.toutiao.com/api/article/feed/?category=essay_joke&utm_source=toutiao&widen=1&\max_behot_time=0&am

今日头条算法

Reference: http://blog.csdn.net/u014114990/article/details/48165781 日头条涉及到算法:(1)今日头条服务器1000台左右,通过代码实现的爬虫功能,在其他传媒的网站和门户上抓取各种信息.如果在网站上抓取到纸媒的内容,优先从纸媒门户上抓取信息(2)抓取信息后,对有价值的信息通过算法进行分析归类.(3)推送到有感兴趣的今日头条客户端(4)用户注册或登录(新浪微博.QQ.人人网)时,通过数据挖掘分析,对用户进行分析,推荐感兴趣的信息.(

php+phantomjs实现今日头条的首页推送抓取

第一次搞爬虫,经验不足,爬出来的效果也不是很好,记录一下吧. 认识的哥们最近在爬今日头条的数据,不过他是做java的.之前也想用php做点爬数据的东西,于是直接也搞今日头条,万一有不明白的地方还能有个人商量.话不多说,上点干货. 关于爬虫,我之前的认知是,curl+正则,有点模糊,下面一步一步说吧  一.观察页面 今日头条的首页推送数据,是通过ajax获取的,打开页面调试我们可以看到下图 请求是每次滚动条滚动到底部触发的,然后我们右键新页面打开这个链接 不难发现这是个接口,返回json数据,在线