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

    2018-03-22 22:02:50
    今日头条爬虫。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
  • 今日头条爬虫实战

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

    今日头条爬虫实战

    前言

    本博客主要记录如何使用python爬虫抓取今日头条上面的新闻链接,然后按照新闻链接抓取新闻的文本信息,以及新闻的热度信息,即评论转发点赞的数量。

    一、怎么获取request url

    首先打开今日头条网站,https://www.toutiao.com/ch/news_hot/,注意要选择左边的热点选项,而不是推荐选项,即最后网址的后缀应该是news_hot
    今日头条
    然后在当前页面按下ctrl+shift+i,进入浏览器开发者模式,在右上角选择network,如下:
    network
    找到以下XHR文件,即中间含有category=news_hot,并且在URL中前缀是https://www.toutiao.com/api/pc/feed/的XHR文件。xhr
    验证,点开preview可以看到所有新闻存储的data是以json形式存储,如下:
    json
    查看每一个新闻的内容:
    在这里插入图片描述
    这里面有很多参数,有media以及image的具体参数,新闻的title以及abstract,还有新闻源的url等等,因此我们可以得到新闻的各个参数,方便以后爬取更多的东西。

    二、爬虫测试

    这时候其实我们已经可以爬取了,今日头条的json文件是不断更新的,我们先尝试用最简单的request来爬取data里面的文件。

    我们先获取User-agent 和 cookies
    从刚才打开的XHR文件中的headers中可以找到:
    如下图所示
    找到
    获取完毕后使用最简单的requests来爬:
    测试时间是2020年12月10号

    import requests
    	#请求头的书写
        headers = {
            'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
            'Cookie': 'csrftoken=a1cec75edb840d9c30e91b908b6df006; tt_webid=6903701895266567693; ttcid=de9284562a3d43158bbcf20f427c76bf38; s_v_web_id=verify_kifci8q5_95283jqK_hVnJ_46JY_BWm0_qh2CKMpqyzNp; tt_webid=6903701895266567693; passport_csrf_token=1360da074931584e4d0f4b71d11ecafe; sid_guard=888954813cb61b04ed109f48e8113b56%7C1607393426%7C5184000%7CSat%2C+06-Feb-2021+02%3A10%3A26+GMT; uid_tt=132acd819771d24afff611bdd48dc359; uid_tt_ss=132acd819771d24afff611bdd48dc359; sid_tt=888954813cb61b04ed109f48e8113b56; sessionid=888954813cb61b04ed109f48e8113b56; sessionid_ss=888954813cb61b04ed109f48e8113b56; tt_anti_token=LjrRoQn9d-fe7a8dbda23884fb006dfd76a297fa069a5ef454622aeb4f2994ae7dfe98ac87; __ac_signature=_02B4Z6wo00f017hqegwAAIBDAKwEUeNa15-4bn6AALHgKC7xunrfsuW0d0EgNAvNrli5JTxbZsoDbHSXIYivhqr4RNY5hZqu5s5PdidP7NkmcwuLCUaSrFmYbBzGkUxLlEUPzgL3ukXRVxfTc5; MONITOR_WEB_ID=5f72b98e-ffdf-406a-86be-15dee611591c; tt_scid=wHyPfUtWjE4zJRDRxq.8YEF2HX25EeVt8-bID9j3Txg3rI66rHH9D7xV9JXAMqKPdf64',
        }
        r = requests.get(url='https://www.toutiao.com/api/pc/feed/?min_behot_time=0&category=news_hot&utm_source=toutiao&widen=1&tadrequire=true&_signature=_02B4Z6wo00f01uYWKLAAAIBCXtBW7S9sSxbmEywAAOZltgS9dx7TKLd.DOq-TC1nLqQ1aA8.sbaw4YU0vtmmTo0wHJT7y1lZ4v3D4BmOdmNuyThwemlMFnGwhZIStsnlR46A4ymuGNCq1I9h32',headers=headers)  
        # 最基本的GET请求
        print(r.status_code)
        #输出请求状态码,200代表请求响应
        print(r.text)
    	#这时输出的json文件是加密的
        data = json.loads(r.text)
        #使用json动态加载
        print(data['data'])
        #json文件访问
        print(len(data['data']))
        #新闻长度是12
    

    输出是我们刚才看到的data文件里面的新闻的json文件:

    这样就可以获得一个时间段头条热点里面的12条新闻的一些参数,我们可以建立一些列表来将其保存下来
    在这里插入图片描述

    三、不间断爬虫

    至于如何不间断爬取更多的新闻我们需要解析request url是怎么生成的,参考下表,表是去年的,现在的url组成可能发生了变化,但是只要我们能找到request url的组成方式,即可以不断的爬取头条网站加载的json文件,挖掘出新闻信息,因为我也很久没弄这个了,先把去年的经验写下来给大家参考,然后具体的细节以及今年头条更改了反爬虫机制,所以需要大家在这一块稍微付出一点努力,然后就可以实现了,爬虫其实很简单,上面那个简单的request便是,大家可以先简单尝试,然后在继续进展后面的部分。

    对比参数解释:
    参数
    其中max_behot_time在获取的json数据中获得,具体数据见如下截图:
    在这里插入图片描述
    至此我们只是获得了爬虫的start url,在后续爬虫的时候需要按照上述参数表来获得新闻的url,从而爬取到新闻。

    继续上文参数,python获取as和cp值
    至于这两个值,在去年爬虫的时候是需要的,而且可以在csdn中搜到相关的博客找到怎么得到as和cp值,至于selenium跟splash的方法今年开始都失效了,头条升级了反爬措施,针对性的ban掉了大部分的webdriver,常用的几个都不行了,现在正面硬缸sig参数似乎也不行。但是既然我们可以用request方法访问到json内部的数据,(上述简单测试于20201210),所以应该是可以刚出url的,相信自己奥利给!具体细节可以参考博文破解头条url参数
    去年我们是随便找的一个代码:

    def get_as_cp():  # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46.js
        zz = {}
        now = round(time.time())
        print(now) # 获取当前计算机时间
        e = hex(int(now)).upper()[2:] #hex()转换一个整数对象为16进制的字符串表示
        print('e:', e)
        a = hashlib.md5()  #hashlib.md5().hexdigest()创建hash对象并返回16进制结果
        print('a:', a)
        a.update(str(int(now)).encode('utf-8'))
        i = a.hexdigest().upper()
        print('i:', i)
        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:', zz)
        return zz
    

    这样完整的链接就构成了,另外提一点就是:_signature参数去掉也是可以获取到json数据的,因此这样请求的链接就完成了;下面附上完整代码:

    这份代码其实是具备参考价值的,只要可以找到今年头条url的相关参数,就可以继续进展下去
    其中只要能摸索出目前今日头条的url组成,基本任务就成功了,加油!

    import requests
    import json
    from openpyxl import Workbook
    import time
    import hashlib
    import os
    import datetime
     #可能不一样
    start_url = 'https://www.toutiao.com/api/pc/feed/?min_behot_time=0&category=news_hot&utm_source=toutiao&widen=1&max_behot_time='
    url = 'https://www.toutiao.com'
     
    headers={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    }
    cookies = {''} # 此处cookies可从浏览器中查找,为了避免被头条禁止爬虫
     
    max_behot_time = '0'   # 链接参数
    title = []       # 存储新闻标题
    source_url = []  # 存储新闻的链接
    s_url = []       # 存储新闻的完整链接
    source = []      # 存储发布新闻的公众号
    media_url = {}   # 存储公众号的完整链接
     
     
    def get_as_cp():  # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46.js
        zz = {}
        now = round(time.time())
        print(now) # 获取当前计算机时间
        e = hex(int(now)).upper()[2:] #hex()转换一个整数对象为16进制的字符串表示
        print('e:', e)
        a = hashlib.md5()  #hashlib.md5().hexdigest()创建hash对象并返回16进制结果
        print('a:', a)
        a.update(str(int(now)).encode('utf-8'))
        i = a.hexdigest().upper()
        print('i:', i)
        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:', zz)
        return zz
     
     
    def getdata(url, headers, cookies):  # 解析网页函数
        r = requests.get(url, headers=headers, cookies=cookies)
        print(url)
        data = json.loads(r.text)
        return data
     
     
    def savedata(title, s_url, source, media_url):  # 存储数据到文件
        # 存储数据到xlxs文件
        wb = Workbook()
        if not os.path.isdir(os.getcwd()+'/result'):   # 判断文件夹是否存在
            os.makedirs(os.getcwd()+'/result') # 新建存储文件夹
        filename = os.getcwd()+'/result/result-'+datetime.datetime.now().strftime('%Y-%m-%d-%H-%m')+'.xlsx' # 新建存储结果的excel文件
        ws = wb.active
        ws.title = 'data'   # 更改工作表的标题
        ws['A1'] = '标题'   # 对表格加入标题
        ws['B1'] = '新闻链接'
        ws['C1'] = '头条号'
        ws['D1'] = '头条号链接'
        for row in range(2, len(title)+2):   # 将数据写入表格
            _= ws.cell(column=1, row=row, value=title[row-2])
            _= ws.cell(column=2, row=row, value=s_url[row-2])
            _= ws.cell(column=3, row=row, value=source[row-2])
            _= ws.cell(column=4, row=row, value=media_url[source[row-2]])
     
        wb.save(filename=filename)  # 保存文件
     
     
     
    def main(max_behot_time, title, source_url, s_url, source, media_url):   # 主函数
        for i in range(3):   # 此处的数字类似于你刷新新闻的次数,正常情况下刷新一次会出现10条新闻,但夜存在少于10条的情况;所以最后的结果并不一定是10的倍数
        ##--------------------------------------------
        #这一部分就是url的组成部分肯定和今年不一样了,然后获取到的json文件的处理后面基本不难,就是分离出相应的参数
            ascp = get_as_cp()    # 获取as和cp参数的函数
            demo = getdata(start_url+max_behot_time+'&max_behot_time_tmp='+max_behot_time+'&tadrequire=true&as='+ascp['as']+'&cp='+ascp['cp'], headers, cookies)
       ##------------------------------------------
            print(demo)
            # time.sleep(1)
            for j in range(len(demo['data'])):
                # print(demo['data'][j]['title'])
                if demo['data'][j]['title'] not in title:
                    title.append(demo['data'][j]['title'])  # 获取新闻标题
                    source_url.append(demo['data'][j]['source_url'])  # 获取新闻链接
                    source.append(demo['data'][j]['source'])  # 获取发布新闻的公众号
                if demo['data'][j]['source'] not in media_url:
                    media_url[demo['data'][j]['source']] = url+demo['data'][j]['media_url']  # 获取公众号链接
            print(max_behot_time)
            max_behot_time = str(demo['next']['max_behot_time'])  # 获取下一个链接的max_behot_time参数的值
            for index in range(len(title)):
                print('标题:', title[index])
                if 'https' not in source_url[index]:
                    s_url.append(url+source_url[index])
                    print('新闻链接:', url+source_url[index])
                else:
                    print('新闻链接:', source_url[index])
                    s_url.append(source_url[index])
                    # print('源链接:', url+source_url[index])
                print('头条号:', source[index])
                print(len(title))   # 获取的新闻数量
     
    if __name__ == '__main__':
        main(max_behot_time, title, source_url, s_url, source, media_url)
        savedata(title, s_url, source, media_url)
    
    展开全文
  • 今天发现今日头条有了新的反扒机制,导致之前的爬虫无法执行,现更新 ## 导入需要的包 import json import os import time from hashlib import md5 from urllib.parse import urlencode import re import ...

    今日头条爬取街拍小姐姐图片--20201022

    今天发现今日头条有了新的反扒机制,导致之前的爬虫无法执行,现更新

    ## 导入需要的包
    import json
    import os
    import time
    from hashlib import md5
    from urllib.parse import urlencode
    import re
    import requests
    from bs4 import BeautifulSoup
    from requests.exceptions import RequestException

    自定义一个函数

    def validatetile(title):
        """
    
        :param title: 传入的参数
        :return: 将无法作为标题的符号替换为_
        """
        rstr = '[/\:*?<>|@]'
        new_title = re.sub(rstr,'_',title)
        return new_title

    获取起始页面信息

    def get_page_index(offset):
        """
    
        :param offset: Ajax 网页每次的偏移值
        :return:输出每次刷新出来的网页
        """
        params = {
            'aid': '24',
            'app_name': 'web_search',
            'offset': offset,
            'format': 'json',
            'keyword': '街拍',
            'autoload': 'true',
            'count': '20',
            'cur_tab': 1
        }
        headers = {
            'user-agent' :'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',
            'referer' : 'https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D'
        }
        url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params)
        try:
            response = requests.get(url, headers = headers)
            if response.status_code == 200:
                return response.text
            return None
        except RequestException:
            print('请求索引页出错')
            return None

    解析页面信息,获取标题和照片url

    def parse_one_index(html):
        """
    
        :param html: 获取到的网页信息
        :return: 一个字典,包含标题和一个图片网址列表
        """
        data = json.loads(html)
        if data and 'data' in data.keys():
            for item in data.get('data'):
                title = item.get('title')
                if 'image_list' in item.keys() and item['image_list'] != []:
                    images = item.get('image_list')
                    imgs = []
                    for image in  images:
                        imgs.append(image.get('url').replace('list/190x124', 'origin').replace('list', 'origin'))
    
                    yield {
                        'title' : title,
                        'image_urls' : imgs
                    }

    保存图片到本地

    def save_image(item):
        if not os.path.exists(r'D:/work/中移/告警事宜/脚本/spider/头条街拍/{}'.format(validatetile(item.get('title')))):
            os.mkdir(r'D:/work/中移/告警事宜/脚本/spider/头条街拍/{}'.format(validatetile(item.get('title'))))
            try:
                for image_url in item.get('image_urls'):
                    response = requests.get(image_url)
                    if response.status_code == 200:
                        file_path = r'D:/work/中移/告警事宜/脚本/spider/头条街拍/{0}/{1}.{2}'.format(validatetile(item.get('title')), md5(response.content).hexdigest(), 'jpg')
                        if not os.path.exists(file_path):
                            with open(file_path, 'wb') as f:
                                f.write(response.content)
                            print('Downloaded image path is:', file_path)
                        else:
                            print('Already Downloaded', file_path)
            except requests.ConnectionError:
                print('Failed to Save Image')
    

    运行主程序

    def main():
        for i in range(3):
            print(f'正在爬取offset为{i * 20}')
            html = get_page_index(i * 20)
            for item in parse_one_index(html):
                save_image(item)
            time.sleep(5)
    
    
    if __name__ == '__main__':
        main()

     

    展开全文
  • 今日头条爬虫记录

    千次阅读 2019-03-26 18:40:08
    首先说明一下爬取思路,调用的是今日头条搜索框,爬取列表页并进入单条详情爬取详情,目的就是实现自定义关键词得到相对应的内容 我们先看网页,正常观察网页发现response里并没有网页内容 所以,我们点击...

    首先说明一下爬取思路,调用的是今日头条搜索框,爬取列表页并进入单条详情爬取详情,目的就是实现自定义关键词得到相对应的内容

    我们先看网页,正常观察网页发现response里并没有网页内容

    所以,我们点击Network下的XHR按钮,看看网页发送了哪些ajax请求

    这时发现有两条数据,对比找一下preview里面 data 标签正式我们需要的内容,有关键词有链接有标题等等

    多对比几条发现也都对的上,所以,这正是我们要的数据!

    找到了数据源就要想办法爬了这里有很多条,其中不乏有我们不需要的假数据,观察发现,真是数据里都含有‘abstract’,所以我们就可以以这个词为判断依据,剔除假的,取到真的,此处上点代码

        def get_articles(self):
            '''获取标题和url'''
            print self.url
            global count
            try:
                response = requests.get(url=self.url)
                res = json.loads(response.text)
                # print response
                # print res
                news = res['data']
                print len(news)
                data_list = []
                for n in news:
                    if n.has_key('abstract'):
                        data_list.append(n)
                    else:
                        pass
                print data_list
                print len(data_list)
                for data in data_list:
                    # print data
                    self.title = data['title']
                    self.group_id = data['group_id']
                    if self.group_id:
                        self.url = "https://www.toutiao.com/a{}/".format(self.group_id)
                    else:
                        self.url = data['article_url']
                    title_list.append(self.title)
                    url_list.append(self.url)
                    # break
            except urllib2.URLError, e:
                print e.reason

     

    到这一步,我们就得到了自定义关键词的标题和url信息,下面就可以进入单条爬取了

    对于详情页,研究发现并不适用bs4提取,所以下面的提取我用的都是正则

    按照上图操作找到文本内容,话不多说上代码

        def download_article(self):
            '''获取详情内容、发帖人、时间'''
            for url in url_list:
                response = requests.get(url=url, headers=self.headers)
                try:
                    res = response.text
                    # 标题
                    r = re.compile(r"content:(.*?),")
                    result = r.findall(res)[0]
                    item = []
                    cont = re.compile(u'[\u4E00-\u9FA5]+')
                    data = cont.findall(result)
                    for i in data:
                        item.append(i)
                    content = ''.join(item).encode("utf-8")
                    print '内容', content
                    # 作者
                    s = re.compile(r"name:(.*?),")
                    source = s.findall(res)[0]
                    print '作者:', source
                    # 时间
                    t = re.findall('time:(.*)', res)
                    time = ''.join(t).encode("utf-8")
                    print '时间', time
                except Exception as e:
                    pass

    此贴终结(手动滑稽)~~~

    需要注意的是我的环境是python2 ,原来代码中文总是提不出来,python3却可以,这个编码问题困扰了我好久,自己动手的小伙伴注意编码格式

     

     

     

    展开全文
  • 今日头条爬虫踩坑之路

    千次阅读 热门讨论 2019-08-07 10:29:52
    头条号: url = https://www.toutiao.com/c/user/3410443345/#mid=3413306633 找数据 页面能访问,开启F12,发现源码并没没有数据 怀疑是Ajax加载,继续找json数据,点开网络、选中xhr、继续往下刷新页面...

    话不多说,直接开始

    • 访问页面

    头条号:
    url = https://www.toutiao.com/c/user/3410443345/#mid=3413306633

    找数据

    • 页面能访问,开启F12,发现源码并没没有数据
      在这里插入图片描述
    • 怀疑是Ajax加载,继续找json数据,点开网络、选中xhr、继续往下刷新页面。诶,貌似找到了。
      在这里插入图片描述
    • 现在把链接复制下来到浏览器打开

    https://www.toutiao.com/c/user/article/?page_type=1&user_id=3410443345&max_behot_time=1565089129&count=20&as=A165EDB4DAA2895&cp=5D4AE2D839055E1&_signature=P5YcVhAaYuK2dyXMdG6kDj-WHE

    bingo,找到了
    在这里插入图片描述

    • 找到几开始分析参数了
      - 这四个参数是在变化的
      max_behot_time 乍一瞅,诶,时间戳
      as,cp,_signature~~~~~~
      打开调试器搜索所有_signature ,其他参数也可以,这个少一点,好找

    在这里插入图片描述转到源文件

    方法一

      function n() {
        var e,
        i = ascp.getHoney(),
        t = '';
        return window.TAC && (t = TAC.sign(userInfo.id + '' + d.params.max_behot_time)),
        e = _.extend({
        }, d.params, {
          as: i.as,
          cp: i.cp,
          _signature: t
        })
    

    python 实现

    import hashlib
    import time
    
    def getHoney():
        e = int(time.time())
        i = hex(e)[2:].upper()
        # print(e, i)
        # 生成md5加密对象
        m1 = hashlib.md5()
        m1.update(str(i).encode(encoding='utf-8'))
        # 生成md5加密后的返回的16禁止字符串
        t = str(m1.hexdigest()).upper()
        a = ''
        r = ''
        o = i[:5]
        n = i[-5:]
        for s in range(5):
            a += o[s] + i[s]
        for l in range(5):
            r += i[l + 3] + n[l]
        _as = "A1" + a + i[-3:]
        cp = i[:3] + r + "E1"
        print('as', _as, '\ncp', cp)
        return _as, cp
    
    if __name__ == '__main__':
        getHoney()
    
    • 重点来了
      _signature, 居然跳转到另一个js文件
      在这里插入图片描述网上找了一位大佬的代码,讲_signature用到的所有js数据放到一个文件中,
      使用python中的execjs,将js文件存到本地,调用就可以得到数据了。
    //window.TAC && (console.log(userInfo.id + "" + a[t]),
    navigator={};window={};navigator.userAgent=""
    function asd() {
        function e(e, a, r) {
            return (b[e] || (b[e] = t("x,y", "return x " + e + " y")))(r, a)
        }
        function a(e, a, r) {
            return (k[r] || (k[r] = t("x,y", "return new x[y](" + Array(r + 1).join(",x[++y]").substr(1) + ")")))(e, a)
        }
        function r(e, a, r) {
            var n, t, s = {}, b = s.d = r ? r.d + 1 : 0;
            for (s["$" + b] = s,
            t = 0; t < b; t++)
                s[n = "$" + t] = r[n];
            for (t = 0,
            b = s.length = a.length; t < b; t++)
                s[t] = a[t];
            return c(e, 0, s)
        }
        function c(t, b, k) {
            function u(e) {
                v[x++] = e
            }
            function f() {
                return g = t.charCodeAt(b++) - 32,
                t.substring(b, b += g)
            }
            function l() {
                try {
                    y = c(t, b, k)
                } catch (e) {
                    h = e,
                    y = l
                }
            }
            for (var h, y, d, g, v = [], x = 0; ; )
                switch (g = t.charCodeAt(b++) - 32) {
                case 1:
                    u(!v[--x]);
                    break;
                case 4:
                    v[x++] = f();
                    break;
                case 5:
                    u(function(e) {
                        var a = 0
                          , r = e.length;
                        return function() {
                            var c = a < r;
                            return c && u(e[a++]),
                            c
                        }
                    }(v[--x]));
                    break;
                case 6:
                    y = v[--x],
                    u(v[--x](y));
                    break;
                case 8:
                    if (g = t.charCodeAt(b++) - 32,
                    l(),
                    b += g,
                    g = t.charCodeAt(b++) - 32,
                    y === c)
                        b += g;
                    else if (y !== l)
                        return y;
                    break;
                case 9:
                    v[x++] = c;
                    break;
                case 10:
                    u(s(v[--x]));
                    break;
                case 11:
                    y = v[--x],
                    u(v[--x] + y);
                    break;
                case 12:
                    for (y = f(),
                    d = [],
                    g = 0; g < y.length; g++)
                        d[g] = y.charCodeAt(g) ^ g + y.length;
                    u(String.fromCharCode.apply(null, d));
                    break;
                case 13:
                    y = v[--x],
                    h = delete v[--x][y];
                    break;
                case 14:
                    v[x++] = t.charCodeAt(b++) - 32;
                    break;
                case 59:
                    u((g = t.charCodeAt(b++) - 32) ? (y = x,
                    v.slice(x -= g, y)) : []);
                    break;
                case 61:
                    u(v[--x][t.charCodeAt(b++) - 32]);
                    break;
                case 62:
                    g = v[--x],
                    k[0] = 65599 * k[0] + k[1].charCodeAt(g) >>> 0;
                    break;
                case 65:
                    h = v[--x],
                    y = v[--x],
                    v[--x][y] = h;
                    break;
                case 66:
                    u(e(t[b++], v[--x], v[--x]));
                    break;
                case 67:
                    y = v[--x],
                    d = v[--x],
                    u((g = v[--x]).x === c ? r(g.y, y, k) : g.apply(d, y));
                    break;
                case 68:
                    u(e((g = t[b++]) < "<" ? (b--,
                    f()) : g + g, v[--x], v[--x]));
                    break;
                case 70:
                    u(!1);
                    break;
                case 71:
                    v[x++] = n;
                    break;
                case 72:
                    v[x++] = +f();
                    break;
                case 73:
                    u(parseInt(f(), 36));
                    break;
                case 75:
                    if (v[--x]) {
                        b++;
                        break
                    }
                case 74:
                    g = t.charCodeAt(b++) - 32 << 16 >> 16,
                    b += g;
                    break;
                case 76:
                    u(k[t.charCodeAt(b++) - 32]);
                    break;
                case 77:
                    y = v[--x],
                    u(v[--x][y]);
                    break;
                case 78:
                    g = t.charCodeAt(b++) - 32,
                    u(a(v, x -= g + 1, g));
                    break;
                case 79:
                    g = t.charCodeAt(b++) - 32,
                    u(k["$" + g]);
                    break;
                case 81:
                    h = v[--x],
                    v[--x][f()] = h;
                    break;
                case 82:
                    u(v[--x][f()]);
                    break;
                case 83:
                    h = v[--x],
                    k[t.charCodeAt(b++) - 32] = h;
                    break;
                case 84:
                    v[x++] = !0;
                    break;
                case 85:
                    v[x++] = void 0;
                    break;
                case 86:
                    u(v[x - 1]);
                    break;
                case 88:
                    h = v[--x],
                    y = v[--x],
                    v[x++] = h,
                    v[x++] = y;
                    break;
                case 89:
                    u(function() {
                        function e() {
                            return r(e.y, arguments, k)
                        }
                        return e.y = f(),
                        e.x = c,
                        e
                    }());
                    break;
                case 90:
                    v[x++] = null;
                    break;
                case 91:
                    v[x++] = h;
                    break;
                case 93:
                    h = v[--x];
                    break;
                case 0:
                    return v[--x];
                default:
                    u((g << 16 >> 16) - 16)
                }
        }
        var n = this
          , t = n.Function
          , s = Object.keys || function(e) {
            var a = {}
              , r = 0;
            for (var c in e)
                a[r++] = c;
            return a.length = r,
            a
        }
          , b = {}
          , k = {};
        r(String.fromCharCode(103,114,36,68,97,116,101,110,32,1048,98,47,115,33,108,32,121,850,121,313,103,44,40,108,102,105,126,97,104,96,123,109,118,44,45,110,124,106,113,101,119,86,120,112,123,114,118,109,109,120,44,38,101,102,102,127,107,120,91,33,99,115,34,108,34,46,80,113,37,119,105,100,116,104,108,34,64,113,38,104,101,105,103,104,116,108,34,118,114,42,103,101,116,67,111,110,116,101,120,116,120,36,34,50,100,91,33,99,115,35,108,35,44,42,59,63,124,117,46,124,117,99,123,117,113,36,102,111,110,116,108,35,118,114,40,102,105,108,108,84,101,120,116,120,36,36,40856,3601,3616,44221,50,60,91,35,99,125,108,35,50,113,42,115,104,97,100,111,119,66,108,117,114,108,35,49,113,45,115,104,97,100,111,119,79,102,102,115,101,116,88,108,35,36,36,108,105,109,101,113,43,115,104,97,100,111,119,67,111,108,111,114,108,35,118,114,35,97,114,99,120,56,56,56,48,50,91,37,99,125,108,35,118,114,38,115,116,114,111,107,101,120,91,32,99,125,108,34,118,44,41,125,101,79,109,121,111,90,66,93,109,120,91,32,99,115,33,48,115,36,108,36,80,98,60,107,55,108,32,108,33,114,38,108,101,110,103,116,104,98,37,94,108,36,49,43,115,36,106,2,108,32,32,115,35,105,36,49,101,107,49,115,36,103,114,35,116,97,99,107,52,41,122,103,114,35,116,97,99,36,33,32,43,48,111,33,91,35,99,106,63,111,32,93,33,108,36,98,37,115,34,111,32,93,33,108,34,108,36,98,42,98,94,48,100,35,62,62,62,115,33,48,115,37,121,65,48,115,34,108,34,108,33,114,38,108,101,110,103,116,104,98,60,107,43,108,34,94,108,34,49,43,115,34,106,5,108,32,32,115,38,108,38,122,48,108,33,36,32,43,91,34,99,115,39,40,48,108,35,105,39,49,112,115,57,119,120,98,38,115,40,41,32,38,123,115,41,47,115,40,103,114,38,83,116,114,105,110,103,114,44,102,114,111,109,67,104,97,114,67,111,100,101,115,41,48,115,42,121,87,108,32,46,95,98,38,115,32,111,33,93,41,108,32,108,32,74,98,60,107,36,46,97,106,59,108,32,46,84,98,60,107,36,46,103,106,47,108,32,46,94,98,60,107,38,105,34,45,52,106,33,31,43,38,32,115,43,121,80,111,33,93,43,115,33,108,33,108,32,72,100,62,38,108,33,108,32,66,100,62,38,43,108,33,108,32,60,100,62,38,43,108,33,108,32,54,100,62,38,43,108,33,108,32,38,43,32,115,44,121,61,111,33,111,33,93,47,113,34,49,51,111,33,108,32,113,34,49,48,111,33,93,44,108,32,50,100,62,38,32,115,46,123,115,45,121,77,111,33,111,33,93,48,113,34,49,51,111,33,93,42,76,100,60,108,32,52,100,35,62,62,62,98,124,115,33,111,33,108,32,113,34,49,48,111,33,93,44,108,33,38,32,115,47,121,73,111,33,111,33,93,46,113,34,49,51,111,33,93,44,111,33,93,42,74,100,60,108,32,54,100,35,62,62,62,98,124,38,111,33,93,43,108,32,38,43,32,115,48,108,45,108,33,38,108,45,108,33,105,39,49,122,49,52,49,122,52,98,47,64,100,60,108,34,98,124,38,43,108,45,108,40,108,33,98,94,38,43,108,45,108,38,122,108,39,103,44,41,103,107,125,101,106,111,123,127,99,109,44,41,124,121,110,126,76,105,106,126,101,109,91,34,99,108,36,98,37,64,100,60,108,38,122,108,39,108,32,36,32,43,91,34,99,108,36,98,37,98,124,38,43,108,45,108,37,56,100,60,64,98,124,108,33,98,94,38,43,32,113,36,115,105,103,110,32), [TAC = {}]);
    }
    asd();
    function test(){
    return TAC.sign("3410443345");
    }
    

    开始生成_signature

    import execjs
    
    with open('jj.js', 'r') as f:
        file = f.read()
    
    data = execjs.compile(file)
    # 参数  str(user_id) + str(时间戳)
    #      str(3410443345) + str(1565051266)
    res = data.eval('TAC.sign({})'.format('34104433451565051266'))
    print(res)
    

    那么~~~
    所有的参数值都可以拿到了
    开始拼接url
    开始访问了。额の…这什么啊,数据呢
    在这里插入图片描述

    方法二

    放大招了,开启selenium + webdriver模式

    from selenium import webdriver
    
    
    def get_as_cp_signature(user_id, mid, max_behot_time):
        '''使用selenium获取as, cp, signature'''
    # def get_signature():
        options = webdriver.ChromeOptions()
        # 设置中文
        options.add_argument('lang=zh_CN.UTF-8')
        # 设置无头浏览器
        options.set_headless()
        options.add_argument(
            'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"')
        brower = webdriver.Chrome(chrome_options=options)
    
        brower.get('https://www.toutiao.com/c/user/{}/#mid={}'.format(user_id, mid))
        # print(brower.current_url)
        ascp = brower.execute_script('return ascp.getHoney({},{})'.format(user_id, mid))
        _as = ascp['as']
        cp = ascp['cp']
        signature = brower.execute_script('return TAC.sign({})'.format(str(user_id) + str(max_behot_time)))
    
        print("="*50)
        print('as: ', _as, '\ncp: ', cp, '\nsignature: ', signature)
    
    
    if __name__ == '__main__':
        user_id = '3410443345'			# 头条号id
        mid = '3413306633'				# 头条号mid
        max_behot_time = 1565073223		# 时间戳
        get_as_cp_signature(user_id=user_id, mid=mid, max_behot_time=max_behot_time)
    

    好了,所有的参数都齐了,那么再次开始访问,
    阿欧~~~
    又一次失败…

    接着来…

    发现一个奇怪的事情
    在火狐浏览器中获取到的json数据地址,复制到Google浏览器中也是没有数据的。

    以下为火狐浏览器中的json数据地址:
    https://www.toutiao.com/c/user/article/?page_type=1&user_id=3410443345&max_behot_time=0&count=20&as=A1B5DD642A12894&cp=5D4A6268C9340E1&_signature=P5YcVhAaYuK2dyXMdG5kfD-WHE

    这该如何是好~~

    接着分析吧, 待更~~~

    展开全文
  • 【转行三重奏】-爬虫Js逆向复习-今日头条as,cp,_signature参数分析。 变更记录 2020/1/10:调整_signature功能部分代码(连续日前有效) 2020/2/27:issue上一个朋友反映的签名失效(因准备转行的关系不再维护,...
  • 最近在学习搜索方面的东西,需要了解网络爬虫方面的知识,虽然有很多开源的强大的爬虫,但本着学习的态度,想到之前在做资讯站的时候需要用到爬虫来获取一些文章,今天刚好有空就研究了一下.在网上看到了一个demo,...
  • 今日头条爬虫

    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...
  • 今日头条是一个js动态加载的网站,尝试了两种方式爬取,一是页面直接提取,一是通过接口提取: version1:直接页面提取 #coding=utf-8 #今日头条 from lxml import etree import requests import urllib2,...
  • 爬取今日头条Ajax请求

    2020-12-11 01:08:41
    搜索头条 可以得到这个网址: https://www.toutiao.com/search/?keyword=街拍 开发者工具查看: 我们在搜索中并没有发现上面的文字,那么我们可以初步判定,这个由Ajax加载,然后渲染出来的。此时切换到xhr过滤,...
  • 完整python项目,可以自己运行。利用python爬虫 爬取今日头条后台数据。然后使用flask框架 实现自己的后台 ,通过爬虫获取 今日头条数据。html实现前端 显示数据。网站UI一级界面自己实现,仿照今日头条网站
  • import requests from urllib.parse import urlencode from requests import RequestException import os from hashlib import md5 import time from multiprocessing import Pool import re def get_page(offset):...
  • 爬虫脚本项目源码-爬取今日头条评论
  • 今日头条文章爬虫实战

    千次阅读 2019-02-27 15:38:15
    原 java爬虫系列 今日头条文章爬虫实战 置顶 2018年03月26日 16:55:31 Mr_OOO 阅读数:3868更多 &lt;div class="...
  • 这就意味着,现在的中学生开始就要学习编程语言了,不会点Python,都不好意思说我们是走在时代前沿的人了Python已广泛应用于大数据、社会网络、数据挖掘、网络爬虫、机器学习、计量经济学等诸多前沿领域,...
  • java爬虫系列(五)——今日头条文章爬虫实战

    万次阅读 热门讨论 2018-03-26 16:55:31
    爬虫目标 爬虫设计思路 爬取方式 动态解析网页方式爬取 解析接口方式爬取 解析思路 破解入口 接口对比 破解加密参数 参数生成方式 解析js 分析接口返回值 解析原文地址 java项目解析 基本功能 队列和线程池 ...
  • python爬取今日头条视频
  • 今日头条是业界知名的技术牛人大团结的公司,今天我们来探讨一下如何规模化的采集获取今日头条的数据。我就一招:iDataAPI。 今日头条数据接口(API):https://www.idataapi.cn/?rec=baidu_0 ...
  • 点击上方“蓝字”关注我们今日头条爬虫实战Mar 27, 2020本期介绍通过在头条中搜索关键词后,分析ajax内容来爬取相关图片本文约1.8k字,预计阅读10分钟。有时候我们在用 「re...
  • 自己用python写了段爬虫代码,想试试今日头条的回复,结果能回复成功,但只有自己能看到 原始代码加运行结果是这样的(这些参数都是抓包抓的): ![图片说明]...
  • 单日今日头条新闻文章采集,信息量大
  • python爬虫 爬取今日头条信息

    千次阅读 2018-08-14 21:35:40
    进入头条首页,在右边输入关键字,进入搜索页面,主要爬取搜索的到的图片以及图片的标题 """" """" python版本:python3.6.5 """" #手动输入搜索...
  • 前言:今日头条用户主页的新闻监控和文章抓取,关键参数的加密破解和整个流程方案。 一、接口的寻找 1.目的是为了获取头条号用户的文章数据,要访问的是这个页面 ...2.进行抓包分析 发现这个是我们需要的数据 ...
  • import requests from urllib.parse import urlencode import os from hashlib import md5 from multiprocessing.pool import Pool def get_page(offset): params = { 'aid': '24', 'app_name': 'web_search', ...
  • from selenium import webdriver// 先导入selenium模块,没安装的自行百度安装就好 ...firefox.get('https://www.toutiao.com/ch/news_fashion/')// 头条链接 ascp = firefox.execute_script('return...
  • 使用python爬虫库requests,urllib爬取今日头条街拍美图 代码均有注释 import re,json,requests,os from hashlib import md5 from urllib.parse import urlencode from requests.exceptions import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,253
精华内容 1,301
关键字:

今日头条爬虫

爬虫 订阅