精华内容
下载资源
问答
  • 今日头条爬虫

    2018-09-11 11:49:00
    import math import time import hashlib def as_cp_clac(): t = int(time.time()) print(t) a = hex(t) a = a.upper() a = a.lstrip('0X') print(a) e = hashli...
        
    import math
    import time
    import hashlib
    
    def as_cp_clac():
        t = int(time.time())
        print(t)
        a = hex(t)
        a = a.upper()
        a = a.lstrip('0X')
        print(a)
        e = hashlib.md5()
        e.update(str(t).encode(encoding='utf-8'))
        e = e.hexdigest().upper()
    
        if len(a) != 8:
            as_str = "479BB4B7254C150"
            cp_str = "7E0AC8874BB0985"
        else:
            s = e[0:5]
            o = e[-5:]
            n = ''
            l = ''
            for i in range(0,5):
                n += s[i] + a[i]
            for j in range(0,5):
                l += a[j+3] + o[j]
            as_str = 'A1' + n + a[-3:]
            cp_str = a[0:3] + l + 'E1'
        return as_str, cp_str
    
    """
    !function(t) {
        var i = {};
        i.getHoney = function() {
            # 获取毫秒数,
            var t = Math.floor((new Date).getTime() / 1e3)
                # 将 t 转为 16 进制 
              , i = t.toString(16).toUpperCase()
              , e = md5(t).toString().toUpperCase();
            if (8 != i.length)
                return {
                    as: "479BB4B7254C150",
                    cp: "7E0AC8874BB0985"
                };
            for (var s = e.slice(0, 5), o = e.slice(-5), n = "", a = 0; 5 > a; a++)
                n += s[a] + i[a];
            for (var l = "", r = 0; 5 > r; r++)
                l += i[r + 3] + o[r];
            return {
                as: "A1" + n + i.slice(-3),
                cp: i.slice(0, 3) + l + "E1"
            }
        }
        ,
    """
    展开全文
  • 今日头条是一个js动态加载的网站,尝试了两种方式爬取,一是页面直接提取,一是通过接口提取:version1:直接页面提取#coding=utf-8#今日头条from lxml importetreeimportrequestsimporturllib2,urllibdefget_url():...

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

    version1:直接页面提取

    #coding=utf-8#今日头条

    from lxml importetreeimportrequestsimporturllib2,urllibdefget_url():

    url= 'https://www.toutiao.com/ch/news_hot/'

    globalcounttry:

    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)printresponse.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

    printtype(title) #for x,y,z,q inzip(title,source,comment,stime):

    count+= 1data={'title':x.text,'source':y.text,'comment':z.text,'stime':q.text}print count,'|',dataexcepturllib2.URLError, e:printe.reasonif __name__ == '__main__':

    count=0

    get_url()

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

    799ebace150ebd25adae09b1d9f88781.png

    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来对时间进行验证

    importrequestsimportjson

    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)printresp.status_code

    Jdata=json.loads(resp.text)#print Jdata

    news = Jdata['data']for n innews:

    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参数:

    importtimeimporthashlibdefget_as_cp():

    zz={}

    now=round(time.time())print now #获取计算机时间

    e = hex(int(now)).upper()[2:] #hex()转换一个整数对象为十六进制的字符串表示

    printe

    i= hashlib.md5(str(int(now))).hexdigest().upper() #hashlib.md5().hexdigest()创建hash对象并返回16进制结果

    if len(e)!=8:

    zz= {'as': "479BB4B7254C150",'cp': "7E0AC8874BB0985"}returnzz

    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"}printzzif __name__ == "__main__":

    get_as_cp()

    展开全文
  • 今日头条爬虫 python

    2018-03-22 22:02:50
    今日头条爬虫。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
  • 点击上方“蓝字”关注我们今日头条爬虫实战Mar 27, 2020本期介绍通过在头条中搜索关键词后,分析ajax内容来爬取相关图片本文约1.8k字,预计阅读10分钟。有时候我们在用 「re...

    点击上方“蓝字”关注我们

    今日头条爬虫实战

    Mar 27, 2020

    本期介绍通过在头条中搜索关键词后,分析ajax内容来爬取相关图片

    本文约1.8k字,预计阅读10分钟。

    有时候我们在用 「requests」抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用 requests得到的结果并没有。这是因为 requests获取的都是原始的HTML 文档,而浏览器中的页面则是经过 JavaScript处理数据后生成的结果,这些数据的来源有多种,可能是通过 Ajax加载的, 可能是包含在 HTML 文档中的,也可能是经过 JavaScript和特定算法计算后生成的

    对于第一种情况,数据加载是一种异步加载方式,原始的页面最初不会包含某些数据,原始页面加载完后,会再向服务器请求某个接口获取数据,然后数据才被处理从而呈现到网页上,这其实就是发送了一个「Ajax」请求 。

    所以如果遇到这样的页面,直接利用 requests等库来抓取原始页面,是无法获取到有效数据的,这时需要分析网页后台向接口发送的「 Ajax」请求,如果可以用「 requests」来模拟 「Ajax」请求,那么就可以成功抓取了 。

    页面分析

    打开Chrome/Safrai中的「检查」---「网络」,在头条官网上进行搜索,例如:天气之子,向下滚动,加载所有的信息,部分结果如下所示:

    选择「XHR」,进行预览,分析「data」,我们主要是获取图片和它的标题(方便分类保存),如下所示:

    我们观察发现:

    • 图片的url都属于image_list字段,且data中表明了大图片的url格式,我们可以对提取的url更改为大图片的url;

    • data中有些并不包含image_list或title,可以将这些情况去除;

    加载单个Ajax请求

    我们首先对请求头部进行分析:

    通过对两个URL的格式分析,变化的参数只有「offset」,它的变化规律为0,20,40,...我们可以推断出它是一个偏移量,故我们可以设置参数offset,方便后续去加载所有的Ajax请求。

    获取单个页面的json数据代码如下:

    def get_page(offset):
      params = {
        'aid': 24,
        'app_name': 'web_search',
        'offset': offset,
        'format': 'json',
        'keyword': '天气之子',
        'autoload': 'true',
        'count': 20,
        'en_qc': 1,
        'cur_tab': 1,
        'from': 'search_tab',
        'pd': 'synthesis',
        'timestamp' : int(time.time_ns() / (10**6))
      }
      headers = {
      # cookie加入重中之重
      'cookie': ('__tasessionId=q6mp1lrxu1583224640956;' 
        'csrftoken=4d4dc07f33b82883b72743f5c81537ab;' 
        's_v_web_id=verify_k7bn2ml4_15YGHeUM_iH2m_4qAg_A8Ec_UlarLgh3Pcej;' 
        'SLARDAR_WEB_ID=4177e739-d79a-44bc-b568-502f52fe45d2;' 
        'tt_scid=7nzno7juT5MPzFuVZIr2zTCJKKlx-nEheWIm47qBeDd7PRKAcGCk-XD5jpZADunmcb54;' 
        'tt_webid=6799872105451128333;' 
        'tt_webid=6799872105451128333;' 
        'ttcid=2204991f51f148848ab9d33a3b1c85a639;' 
        'WEATHER_CITY=%E5%8C%97%E4%BA%AC'),
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537/36'+
      '(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537/36'
      }
      url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params)
      try:
        res = requests.get(url, headers=headers)
        if res.status_code == 200:
          return res.json()
      except requests.ConnectionError:
        return None
    

    注:

    • 「请求头部需要添加cookie,不然返回为空。」

    • urlencode:将参数进行序列化; 

    • 返回爬取页面的json形式,再对其进行解析时就不需要解析库进行分析了;

    获取图片

    返回的json为一个字典,我们需要它key为data的value,然后对data进行遍历:

    • 首先判断当前是否存在title和image_list字段,不存在则跳过;

    • 获取title和image_list对应的值,接着需要遍历image_list:

      • 通过上述对图片的分析,我们需要大图片,故通过re.sub()方法对部分字符进行替换,因为存在两种格式,故分别进行分析替换

    • 将图片和标题进行返回,此时来构造一个生成器(发现比直接使用list好用多了)

    代码如下:

    def get_images(json):
      if json.get('data'):
        for item in json.get('data'):
          if item.get('title') and item.get('image_list'):
             title = item.get('title')
             images = item.get('image_list')
             for image in images:
               if "190x124" in image.get('url'):
                 image_url = re.sub('list/190x124', 'large', image.get('url'))
               else:
                 image_url = re.sub('list', 'large', image.get('url'))
               yield{
               'image': image_url,
               'title': title
               }
    

    保存图片

    我们将所有的内容放在data/tianqizhizi下,并将每一个标题作为一个文件夹,生成对应目录;

    代码如下:

    def save_images(item):
      path = 'data/tinaiqzhizi/' + item.get('title')
      if not os.path.exists(path):
        os.makedirs(path)
      try:
        res = requests.get(item.get('image'))
        if res.status_code == 200:
          print(item)
          file_path = '{0}/{1}.{2}'.format(path, 
            md5(res.content).hexdigest(), 'png')
          if not os.path.exists(file_path):
            with open(file_path, 'wb') as f:
              f.write(res.content)
          else:
            print('Already Download', file_path)
      except requests.ConnectionError:
        print('Falied to Save Image')
    

    注:

    • 通过图片的url获取对应的二进制信息。

    • 图片的名称可以使用其内容的 MD5 值,这样可以去除重复。

    • 将二进制内容写入。

    主函数

    加载单个ajax后保存图片:

    def main(offset):
      json = get_page(offset)
      for item in get_images(json):
        save_images(item)
    

    实现多进程进行下载:

    if __name__ == '__main__':
      pool = Pool()
      groups = [x * 20 for x in range(0, 9)]
      pool.map(main, groups)
      pool.close()
      pool.join()
    

    GitHub

    GitHub地址:https://github.com/BlackSpaceGZY/Crawler

    参考文献

    [1] 崔庆才.python3网络爬虫实战[M].北京:人民邮电出版社,2018.

    扫码关注更多精彩

    展开全文
  • 在网上看到了一个demo,使用的是Jsoup,我拿过来修改了一下,由于今日头条的文章的特殊性,所以无法直接获取文章的地址,需要获取文章的id然后在拼接成url再访问.public class Demo2 {public static void main(String[] ...

    之前在做资讯站的时候需要用到爬虫来获取一些文章,今天刚好有空就研究了一下.在网上看到了一个demo,使用的是Jsoup,我拿过来修改了一下,

    由于今日头条的文章的特殊性,所以无法直接获取文章的地址,需要获取文章的id然后在拼接成url再访问.

    public class Demo2 {

    public static void main(String[] args) {

    // 需要爬的网页的文章列表

    String url = "http://www.toutiao.com/news_finance/";

    //文章详情页的前缀(由于今日头条的文章都是在group这个目录下,所以定义了前缀,而且通过请求获取到的html页面)

    String url2="http://www.toutiao.com/group/";

    //链接到该网站

    Connection connection = Jsoup.connect(url);

    Document content = null;

    try {

    //获取内容

    content = connection.get();

    } catch (IOException e) {

    e.printStackTrace();

    }

    //转换成字符串

    String htmlStr = content.html();

    //因为今日头条的文章展示比较奇葩,都是通过js定义成变量,所以无法使用获取dom元素的方式获取值

    String jsonStr = StringUtils.substringBetween(htmlStr,"var _data = ", ";");

    System.out.println(jsonStr);

    Map parse = (Map) JSONObject.parse(jsonStr);

    JSONArray parseArray = (JSONArray) parse.get("real_time_news");

    Map map=null;

    List maps=new ArrayList<>();

    //遍历这个jsonArray,获取到每一个json对象,然后将其转换成Map对象(在这里其实只需要一个group_id,那么没必要使用map)

    for(int i=0;i

    map = (Map)parseArray.get(i);

    maps.add((Map)parseArray.get(i));

    System.out.println(map.get("group_id"));

    }

    //遍历之前获取到的map集合,然后分别访问这些文章详情页

    for (Map map2 : maps) {

    connection = Jsoup.connect(url2+map2.get("group_id"));

    try {

    Document document = connection.get();

    //获取文章标题

    Elements title = document.select("[class=article-title]");

    System.out.println(title.html());

    //获取文章来源和文章发布时间

    Elements articleInfo = document.select("[class=articleInfo]");

    Elements src = articleInfo.select("[class=src]");

    System.out.println(src.html());

    Elements time = articleInfo.select("[class=time]");

    System.out.println(time.html());

    //获取文章内容

    Elements contentEle = document.select("[class=article-content]");

    System.out.println(contentEle.html());

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    }

    展开全文
  • 前言需要提前说下的是,由于今日头条的文章的特殊性,所以无法直接获取文章的地址,需要获取文章的id然后在拼接成url再访问。下面话不多说了,直接上代码。示例代码如下public class Demo2 {public static void main...
  • 今日头条是一个js动态加载的网站,尝试了两种方式爬取,一是页面直接提取,一是通过接口提取: version1:直接页面提取 #coding=utf-8 #今日头条 from lxml import etree import requests import urllib2,...
  • 今日头条爬虫实战

    千次阅读 2020-12-08 11:04:23
    今日头条爬虫实战 文章目录 今日头条爬虫实战 前言 一、怎么获取request url 二、爬虫测试 三、不间断爬虫 前言 本博客主要记录如何使用python爬虫抓取今日头条上面的新闻链接,然后按照新闻链接抓取新闻的文本信息...
  • 今日头条爬虫记录

    千次阅读 2019-03-26 18:40:08
    首先说明一下爬取思路,调用的是今日头条搜索框,爬取列表页并进入单条详情爬取详情,目的就是实现自定义关键词得到相对应的内容 我们先看网页,正常观察网页发现response里并没有网页内容 所以,我们点击...
  • java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取(详细)一.此爬虫介绍今日头条本身就是做爬虫的,爬取各大网站的图片文字信息,再自己整合后推送给用户,特别是里面的动态图片,很有意思。在网上搜了...
  • 【学习】02 今日头条爬虫-采集和下载关键词“新垣结衣”的图集图片
  • 自己用python写了段爬虫代码,想试试今日头条的回复,结果能回复成功,但只有自己能看到 原始代码加运行结果是这样的(这些参数都是抓包抓的): ![图片说明]...
  • 今日头条爬虫踩坑之路

    千次阅读 热门讨论 2019-08-07 10:29:52
    头条号: url = https://www.toutiao.com/c/user/3410443345/#mid=3413306633 找数据 页面能访问,开启F12,发现源码并没没有数据 怀疑是Ajax加载,继续找json数据,点开网络、选中xhr、继续往下刷新页面...
  • 今天发现今日头条有了新的反扒机制,导致之前的爬虫无法执行,现更新 ## 导入需要的包 import json import os import time from hashlib import md5 from urllib.parse import urlencode import re import ...
  • from selenium import webdriver// 先导入selenium模块,没安装的自行百度安装就好 ...firefox.get('https://www.toutiao.com/ch/news_fashion/')// 头条链接 ascp = firefox.execute_script('return...
  • 0x0 背景最近学习爬虫,分析了几种主流的爬虫框架,决定使用最原始的两大框架进行练手:Jsoup&HttpUnit其中jsoup可以获取静态页面,并解析页面标签,最主要的是,可以采用类似于jquery的语法获取想要的标签元素...
  • 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;... Androi...
  • 前言:今日头条用户主页的新闻监控和文章抓取,关键参数的加密破解和整个流程方案。 一、接口的寻找 1.目的是为了获取头条号用户的文章数据,要访问的是这个页面 ...2.进行抓包分析 发现这个是我们需要的数据 ...
  • 今日头条街拍爬虫

    2021-03-15 23:43:09
    最近在学习崔庆才老师写的《python3网络爬虫开发实战》,学到第六章分析Ajax爬取今日头条街拍美图,发现书中的代码已经不适用于现在的头条爬取了,故做了一些改动。发博记录一下自己遇到的问题及解决方法。 进入正题...
  • 今日头条文章爬虫实战

    千次阅读 2019-02-27 15:38:15
    原 java爬虫系列 今日头条文章爬虫实战 置顶 2018年03月26日 16:55:31 Mr_OOO 阅读数:3868更多 &lt;div class="...
  • spider.pyimport jsonimport osfrom urllib.parse import urlencodeimport pymongoimport requestsfrom bs4 import BeautifulSoupfrom requests.exceptions import ConnectionErrorimport refrom multiprocessing im...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 676
精华内容 270
关键字:

今日头条爬虫

爬虫 订阅