精华内容
下载资源
问答
  • 前言在学了py的静态爬虫之后,总是感觉有点缺什么,仔细一想,静态的网页会了,但是有的网站人家用的是ajax搞的,这可怎么办啊!于是乎,就想搞点动态爬虫玩玩。开搞1.安装requests和json2.伪装浏览器url = '...

    前言

    在学了py的静态爬虫之后,总是感觉有点缺什么,仔细一想,静态的网页会了,但是有的网站人家用的是ajax搞的,这可怎么办啊!于是乎,就想搞点动态爬虫玩玩。

    开搞

    1.安装requests和json

    2.伪装浏览器

    url = 'https://book.qidian.com/ajax/book/category?_csrfToken=BXnzDKmnJamNAgLu4O3GknYVL2YuNX5EE86tTBAm&bookId=3144877'

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',

    'Referer': 'https://book.qidian.com/info/3144877',

    'Cookie': '_csrfToken=BXnzDKmnJamNAgLu4O3GknYVL2YuNX5EE86tTBAm; newstatisticUUID=1564467217_1193332262; qdrs=0%7C3%7C0%7C0%7C1; showSectionCommentGuide=1; qdgd=1; lrbc=1013637116%7C436231358%7C0%2C1003541158%7C309402995%7C0; rcr=1013637116%2C1003541158; bc=1003541158%2C1013637116; e1=%7B%22pid%22%3A%22qd_P_limitfree%22%2C%22eid%22%3A%22qd_E01%22%2C%22l1%22%3A4%7D; e2=%7B%22pid%22%3A%22qd_P_free%22%2C%22eid%22%3A%22qd_A18%22%2C%22l1%22%3A3%7D'

    }

    3.使用requests发送请求 ,并转码

    res = requests.get(url=url, params=headers)

    s = str(res.content, "utf-8")

    4.使用json进行str到json的转换

    load = json.loads(s)

    55482546febe

    打印结果

    5.逐层解析

    for (k, v) in load.items(): # 类型为dict

    if k == "data":

    for (i, j) in v.items(): # 类型为dict

    if i == "vs":

    for p in j: # 类型为list

    for (a, b) in p.items(): # 类型为dict

    if a == "vId" or a == "cCnt" or a == "vN": # py自带的判断

    print(a, b)

    if a == "cs":

    for q in b:

    print(q)

    55482546febe

    打印结果

    6.这些只是用于解析非vip的书,VIP的咱还不会啊

    展开全文
  • data = json['data']
  • F5 一般ajax数据是json格式获取筛选XHR 再点Preview 看数据 发现是空的不是json数据只能回到All 再看得json 解析出数据点击进去看是这样typeof jQuery112409131255202867523_1543847210853 === 'function' &...

    抓包找传数据的url

    先抓包 F12 -> Network -> F5 一般ajax数据是json格式获取

    1897a8068dfb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    筛选XHR 再点Preview 看数据 发现是空的

    1897a8068dfb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    不是json数据

    只能回到All 再看

    得json 解析出数据

    点击进去看是这样

    1897a8068dfb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    typeof jQuery112409131255202867523_1543847210853 === 'function' && jQuery112409131255202867523_1543847210853({这之间的数据是被传的json数据});

    import requests

    link = "https://api-zero.livere.com/v1/comments/list?callback=jQuery1124049866736766120545_1506309304525&limit=10&offset=1&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1506309304527"

    headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

    r = requests.get(link,heade rs= headers)

    json_string = r.text

    json_string = json_string[json_string.find('{'):-2]

    看json结构

    "results": {

    "parents":

    [

    { ....

    "content": "评论试试啊 :smiley:",

    ....

    },

    { ....

    "content": "121212",

    ....

    },

    ]

    }

    json_data = json.loads(json_string)

    comment_list = json_data['results']['parents']

    for eachone in comment_list:

    message = eachone['content']

    print (message)

    URL地址的规律

    1897a8068dfb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    对比第一页第二页的参数

    1897a8068dfb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    1897a8068dfb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    对比可以发现 关键是offset

    for page in range(1,4):

    link1 = "https://api-zero.livere.com/v1/comments/list?callback=jQuery112407875296433383039_1506267778283&limit=10&offset="

    link2 = "&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1506267778285"

    page_str = str(page)

    # 拼接得url

    link = link1 + page_str + link2

    完整代码

    import requests

    import json

    # 打印一页的评论

    def single_page_comment(link):

    headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}

    r = requests.get(link, headers= headers)

    # 获取 json 的 string

    json_string = r.text

    json_string = json_string[json_string.find('{'):-2]

    json_data = json.loads(json_string)

    comment_list = json_data['results']['parents']

    for eachone in comment_list:

    message = eachone['content']

    print (message)

    # 1 2 3 4 页的评论

    for page in range(1,4):

    link1 = "https://api-zero.livere.com/v1/comments/list?callback=jQuery112407875296433383039_1506267778283&limit=10&offset="

    link2 = "&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1506267778285"

    page_str = str(page)

    link = link1 + page_str + link2

    print (link)

    single_page_comment(link)

    展开全文
  • JRex java webbrowser 爬虫ajax网页 源码

    热门讨论 2010-09-19 14:00:12
    一般在浏览器中查看页面代码 是浏览器直接下载到的页面代码 在未经渲染前 对于JS AJAX输出的内容是无法得到的 这样我们得到的页面内容和直接走socket抓取回来无任何区别 还是无法得到需要的页面内容。 JS函数及页面...
  • ajax 豆瓣电影初爬取

    实现用fiddler抓取https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=下以ajax请求方式的真正的url
    这里写图片描述
    然后把浏览器滚动条移到底部,浏览器又发出ajax请求:
    这里写图片描述

    # coding:utf-8
    import urllib
    import urllib2
    
    url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action="
    
    headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    
    startPage = raw_input("请输入开始的页码数:")
    size = raw_input("请输入每页的数量:")
    #ajax请求真实url的拼接
    fullurl = url + "&start=" + str(startPage) + "&limit=" + str(size)
    
    request = urllib2.Request(fullurl,headers = headers)
    response = urllib2.urlopen(request)
    print response.read()
    展开全文
  • 一、Ajax简介 什么是AjaxAjax 即“AsynchronousJavascriptAndXML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步...

    一、Ajax简介

    什么是Ajax?

    Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。

    通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。

    我们在浏览很多网页,比如微博,我们点击进去某条微博,底下可以加载出网友的评论,但是我们可以看到网址是没有改变的,这就是使用了ajax技术。这次以爬取今日头条的图片为例来进行Ajax数据爬取的实战演示。本文也是学习自崔庆才博主的书籍。

    二、逻辑分析

    首先打开今日头条的网站:https://www.toutiao.com/,在搜索框内可以输入任意的内容,比如我爬取的是关于风景的图片。这里我使用的是谷歌浏览器,右键检查,选择NetWork,查看所有的网络请求。可以看到第一条网络请求就是当前的链接。点击这条请求,查看Response。如果我们这个网页是由这个请求的结果渲染出来的,那么这个请求的源代码中肯定会包含网页结果中的文字。这边可以使用搜索验证,比如搜索一下标题结果中的“破万”两个字,可以发现在这个请求中没有匹配的的结果。说明这些内容是由Ajax所加载的。

    下面就可以分析Ajax请求了,Ajax的数据类型为xhr,这边可以在上面选择XHR,这样显示出来的就都是ajax请求,将网页从上拉到最下,可以看见请求逐渐变多。点击第一个请求,可以在右边看到显示出了不同的信息。

    复制一下右边的Request URL,可以看到返回了json数据,所以我们的第一步就是分析请求url,获取返回的json数据。

    三、加载单个Ajax请求

    点击每个Ajax请求,可以看到他们的Request URL参数基本相同,唯一有变化的是offset,变化规律为每次+20,所以我们在实现方法是,传入offset作为参数。然后请求的方式为GET。

    以第一个请求的url为例子:

    https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E9%A3%8E%E6%99%AF&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp=1557652705403

    可以看到所有的参数,由次可以构造URL,然后请求这个链接,如果返回的状态码为200,那么就使用respnse.json()方法来将结果转化为json模式并返回。

    #  唯一的变化就是offset
    def get_page(offset):
        params = {
            'aid': '24',
            'offset': offset,
            'format': 'json',
            'autoload': 'true',
            'count': '20',
            'cur_tab': '1',
            'from': 'search_tab',
            'pd': 'synthesis'
        }
        base_url = 'https://www.toutiao.com/api/search/content/?keyword=%E9%A3%8E%E6%99%AF'  #这一部分都是相同的参数
        url = base_url + urlencode(params) # 构造请求的GET参数
        print(url) # 可以打印出url看自己构建的是否有效
        try:
            resp = requests.get(url)
            if 200 == resp.status_code:
                print(resp.json()) # 看下返回结果是否正确
                return resp.json()
        except requests.ConnectionError:
            return None

    四、解析结果

    我们在获取json结果后,就要从中解析提取出我们所要爬取的数据。点击data可以看见很多条数据,每条数据里都有一个image_list字段,包含了我们所要爬取的图片url,所以我们要在刚才返回的结果内将图片url提取出来,通过构造一个生成器,将图片链接和标题返回。

    # 提取图片链接和图片标题
    def get_images(json): # 将刚才的json传入
        if json.get('data'): # 找到data
            data = json.get('data')
            for item in data: # 找到data中标题和图片链接列表
                title = item.get('title')
                images = item.get('image_list')
                for image in images: # 构造生成器
                    yield {
                        'image':  image.get('url'),
                        'title': title
                    }

    五、保存图片

    将所有图片的url返回后,我们就需要一个方法来下载图片并保存。首先我们要根据返回的title值创建文件夹,然后请求这个图片链接,获取数据,以二进制形式写入文件。图片名称可以根据其内容的MD5值来命名。

    # 保存图片方法
    # 根据title创建文件夹,然后根据图片链接获取图片二进制文件,写入文件,图片名称为其内容的MD5值
    def save_image(item):
        img_path = 'img' + os.path.sep + item.get('title') # os.path.sep这是路径分割符
        print(img_path)
        if not os.path.exists(img_path): # 如果不存在文件夹就创一个
            os.makedirs(img_path)
        try:
            resp = requests.get(item.get('image'))
            if codes.ok == resp.status_code:
                # 使用format方法格式化,生成文件路径
                file_path = img_path + os.path.sep + '{file_name}.{file_suffix}'.format(
                    file_name=md5(resp.content).hexdigest(), # 将文件保存时,通过哈希函数对每个文件进行文件名的自动生成
                    file_suffix='jpg')
                if not os.path.exists(file_path):
                    with open(file_path, 'wb') as f: # 还未下载则写入文件内容
                        f.write(resp.content) 
                    print('Downloaded image path is %s' % file_path)
                else:
                    print('Already Downloaded', file_path)
        except requests.ConnectionError:
            print('Failed to Save Image,item %s' % item)

    六、传入offset参数,多进程下载

    def main(offset):
        json = get_page(offset)  # 获得json的返回结果
        for item in get_images(json):  # 解析json获得包括标题以及图片链接的词典item
            print(item)  # 打印处词典信息
            save_image(item)  # 保存图片
    
    
    GROUP_START = 0 #offset最多到120
    GROUP_END = 6
    
    if __name__ == '__main__':
        pool = Pool()  # python多进程,创建进程池
        groups = ([x * 20 for x in range(GROUP_START, GROUP_END + 1)])  # 传入1到20的参数
        pool.map(main, groups)  # main表示要执行的方法, 后面表示被操作的数据列表
        pool.close()  # 关闭进程池,不再接受新的进程
        pool.join()  # 主进程阻塞等待子进程的退出
    

    七、查看结果

    在当前路径下会发现生成了一个img文件夹,点击进去就可以看见以title命名的各个文件夹,文件内就是以MD5值命名的图片。

    这是一个简单的爬虫,也是我学习爬虫后第一次爬取ajax请求,大家也可以尝试爬取其他网站的图片。

     

    展开全文
  • 有一类页面,它的翻页是用ajax处理的,也就是翻页前后url没有发生变化,如果要爬这类页面,无法用传统的、获得url规则的方法,可以考虑使用selenium+phantomjs模拟鼠标点击翻页按钮。但是模拟鼠标点击翻页之后,取...
  • 一般在浏览器中查看页面代码 是浏览器直接下载到的页面代码 在未经渲染前 对于JS AJAX输出的内容是无法得到的 这样我们得到的页面内容和直接走socket抓取回来无任何区别 还是无法得到需要的页面内容。 JS函数及页面...
  • #做爬虫的时候,有时候回用到ajax请求换页 原来一直都是不太懂,在network中把所有的选项都找一遍,才能找到 总结规律: 1.如果请求的是ajax用chrome中的NETWORK中的XHR 中查找: 2.如果采用是普通的换页,则去观察...
  • ajax渲染,要在network的response找到文件所在的url j= 0 for i in range(0,54 ): if i== 0: URL = url+ " .htm " else : URL =url+ " _ " +str(i)+ " .htm " # print(URL) soup= get_url(URL) ...
  • 爬虫 ajax网页(Cobra)

    千次阅读 2011-06-02 11:43:00
    有js逻辑的页面,对网络爬虫的信息抓取工作造成了很大障碍。DOM树,只有执行了js的逻辑才可以完整的呈现。而有的时候,有要对js修改后的 dom树进行解析。在搜寻了大量资料后,发现了一个开源的项目cobra。cobra...
  • 获取JSON是最简单的,直接输入URL就行了不需要写爬虫。O(∩_∩)O哈哈~ 豆瓣电影 #!/usr/bin/env python # -*- coding:utf-8 -*- import ssl import urllib import urllib2 url = ...
  • 1.什么是ajax数据爬取: 通常我们在使用requests抓取页面的时候,得到的html源码可能和在浏览器中看到的不一样,在页面上则可以看到数据,这是因为数据是听过ajax异步加载的,原始页面不会包含某些数据,原始页面...
  • 爬虫处理AJAX

    2021-03-31 11:05:24
    爬虫第一次遇到Ajax,遂记录一下。 1 目标 站长之家云观测,百度云加速在北京的IP地址。 网页地址:http://cdn.chinaz.com/server/百度云加速 2 爬取过程 可以看到北京IP节点分布由1961条记录,共99页,但是它...
  • 网络爬虫爬取Ajax

    2011-09-14 09:52:01
    利用ruby技术实现网络爬虫爬取Ajax
  • Python爬虫Ajax数据爬取,通过Ajax实现爬取某微博博主的多篇文章
  • Ajax爬虫

    2020-04-30 22:27:25
    文章目录什么是Ajax爬虫?什么是AjaxAjax如何分析页面? 什么是Ajax爬虫? 1. 浏览器中可看到正常显示的数据,但使用requests得到的结果并没有。 这是什么原因呢? requests获取的是原始的HTML文档,而浏览器中的...
  • 爬虫Ajax分析方法.pdf
  • 文章目录Ajax/selenium爬虫一、为什么用Ajax二、什么是Ajax三、Ajax怎么分析页面四、基于Ajax和requests采集器的微博爬虫五、基于selenium实现爬虫 Ajax/selenium爬虫 一、为什么用Ajax 1. 浏览器中可看到正常显示的...
  • 在本篇内容里小编给大家整理的是关于Python3爬虫Ajax的用法,需要的朋友们可以参考下。
  • 网络爬虫--Ajax爬虫

    2020-05-03 23:11:08
    什么是Ajax? 为什么要用Ajax? 问:浏览器中可看到正常显示的数据,但使用requests得到的结果并没有。 这是什么原因呢? 答:requests获取的是原始的HTML文档,而浏览器中的页面是经过JS处理数据后生成的结果。 问...
  • Python爬虫Ajax请求

    千次阅读 2020-08-17 11:27:07
    AJAX 是 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)的缩写。AJAX 通过使用原有的 web 标准组件,实现了在不重新加载整个页面的情况下,与服务器进行数据交互。例如在新浪微博中,你可以展开一条...
  • 今天终于把爬虫Ajax请求搞懂了

    热门讨论 2021-06-07 14:49:35
    今天终于把爬虫Ajax请求搞懂了 文章目录今天终于把爬虫Ajax请求搞懂了一、案例分析及存在的问题二、问题的解决Ajax简介问题解决三、总结1、Ajax2、XMLHttpRequest3、解决问题 一、案例分析及存在的问题 首先,...
  • 爬虫练习,针对ajax爬虫练习,使用脚本爬去今日头条街拍栏目下的街拍图片并保存在本地
  • 爬虫Ajax分析方法

    千次阅读 2019-01-18 22:11:40
    接下来,不断滑动页面,可以看到页面底部有一条条新的微博被刷出,而开发者工具下方也一个个地出现Ajax请求,这样我们就可以捕获到所有的Ajax请求了。 随意点开一个条目,都可以清楚地看到其Request URL、Request...
  • 拉勾网Ajax爬虫

    2020-02-05 18:23:53
    项目介绍:本项目为使用requests库实现Ajax爬虫项目。项目目标是将指定关键词下的所有搜索结果的全部信息爬取下来(包括:职位详情页url,公司全名,公司缩写名,公司规模,行业领域,金融阶段,公司标签,第一...
  • python爬虫ajax请求

    2018-08-09 08:06:41
    python爬虫ajax请求 爬取豆瓣网的分页浏览get请求: import urllib.request import urllib.parse url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,015
精华内容 9,606
关键字:

如何爬虫ajax

爬虫 订阅