搜尋

首頁  >  問答  >  主體

python - 怎麼爬取被 下一頁覆蓋/JS渲染 的網頁內容?

我想提取網頁:http://www.igxe.cn/h1z1/43385... 上該物品的當前售價和對應商品的ITEM_ID

我使用的是PYTHON2.7配合requests進行操作的,程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

<code>import requests

import sys

headers = {'User-Agent': 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M032 Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/4.1 Mobile Safari/533.1'}

r = requests.get('http://www.igxe.cn/h1z1/433850/product-567592', headers = headers,stream=True)

print r.request.headers['User-Agent']

print r.text

reload(sys)

sys.setdefaultencoding('utf-8')

f = open('/workspace/test.txt', 'w')

f.write (r.text)

f.close

</code>

得到的該代碼文件包含了網頁上絕大部分信息,唯獨就是沒有我需要的售價信息以及物品ID,但是該段信息卻可以通過瀏覽器的審查元素獲得,代碼片段如下:

這段程式碼片段透過審查元素可以輕鬆取得,但是原始程式碼上卻沒有,所以十分困惑該如何取得。
在原始碼中找到如下片段,不知道是不是AJAX有關的資訊取得的方式:

<script src="/static/csgo/js/page.js"></script>

<script>

1

2

3

4

<code>var price_sort = 1;

var lock_sort = 1;

var status_locked = 0;

</code>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

<code>var get_params = function (_page_no, _page_size, _status_locked, _price_sort, _lock_sort) {

    var data = {};

    data['page_no'] = _page_no;

    data['page_size'] = _page_size;

    data['status_locked'] = _status_locked;

    data['price_sort'] = _price_sort;

    data['lock_sort'] = _lock_sort;

 

    return data;

};

 

var load_data = function (params) {

    if (!AjaxLogin.is_login_box(params.page_no > 1)) {

        return false;

    }

    $.ajax({

        'type': "GET",

        'url': "/h1z1/433850/get_list_tmp/568258/" + params.status_locked + "/" + params.page_no + "/" + params.price_sort + "/" + params.lock_sort +"?steamid=",

        'data': {},

        'dataType': "json",

        beforeSend: function () {

        },

        success: function (data) {

            var $t_body = $('#js-tbody-data');

            var $page = $('#js-page-html');

 

            if (data.succ) {

 

                $t_body.html(data.data_html);

                $page.html(data.page_html);

 

            } else {

                alert(data.message);

            }

 

            Core.ui.loader.hide();

        },

        error: function (XmlHttpRequest, textStatus, errorThrown) {

            Core.ui.loader.hide();

        }

    });

};

 

var load = function () {

    var param = get_params(1, 20, status_locked, price_sort, lock_sort);

    load_data(param);

};

 

var change_sort_style = function ($dom, _sort) {

    if (_sort == 1) {

        $dom.addClass('sort__up');

        $dom.removeClass('sort__down');

    } else if (_sort == 2) {

        $dom.addClass('sort__down');

        $dom.removeClass('sort__up');

    } else {

        $dom.removeClass('sort__up');

        $dom.removeClass('sort__down');

    }

};

 

var page_callback = function (page_no) {

    var param = get_params(page_no, 20, status_locked, price_sort, lock_sort);

    load_data(param);

};

</code>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

<code>$(function () {

     

 

        var pid = "568258";

     

 

    Core.ui.tab($('#js-dota-tabs .js-item'), $('#js-dota-panel .js-item'), 'click');

 

    load();

 

    var tradeBtn = $('#js-btn-tradeBuy');

    var weaponKey = $('#js-pop-weaponKey');

 

    var $sort_lock = $('#js-sort-lock');

    var $sort_price = $('#js-sort-price');

    var $page = $('#js-page-html');

 

    $page.on('click', '.js-page', function () {

        var page_no = $(this).attr('page_no');

        page_callback(page_no);

    });

 

    $page.on('click', '.js-page-jump', function () {

        var page_no = $(this).prev().val();

        page_callback(page_no);

    });

 

    $page.on('keyup', '.js-page-jump-no', function (e) {

        $(this).val($(this).val().replace(/[^0-9.]/g, ''));

        if (!$(this).val()) {

            $(this).val(1);

        }

    });

 

    $page.on('keydown', '.js-page-jump-no', function (e) {

        var curKey = e.which;

        if (curKey == 13) {

            page_no = $('.js-page-jump-no').val();

            page_callback(page_no);

        }

    });

 

    $sort_lock.on('click', function(){

        if(lock_sort==1){

            lock_sort = 2;

        } else {

            lock_sort = 1;

        }

        load();

        change_sort_style($(this), lock_sort);

        price_sort = 0;

        change_sort_style($sort_price, price_sort);

    });

 

    $sort_price.on('click', function () {

        if (price_sort == 1) {

            price_sort = 2;

        } else {

            price_sort = 1;

        }

        load();

        change_sort_style($(this), price_sort);

        lock_sort = 0;

        change_sort_style($sort_lock, lock_sort);

    });

 

    $('#js-find-locked').on('click', function () {

        if ($(this).prop('checked')) {

            status_locked = 1;

        } else {

            status_locked = 0;

        }

        lock_sort = 1;

        price_sort = 1;

        change_sort_style($sort_lock, 0);

        change_sort_style($sort_price, 0);

 

        load();

    });

 

    $('#js-buy-count').on('keyup', function () {

        $(this).val($(this).val().replace(/[^0-9]/g, ''));

        var value = $(this).val();

        if (value > 100) {

            $(this).val(100);

        }

    });

    $('#js-money-start').on('keyup', function () {

        $(this).val($(this).val().replace(/[^0-9.]/g, ''));

        var value = $(this).val();

        if (value > 99999) {

            $(this).val(99999);

        }

    });

    $('#js-money-end').on('keyup', function () {

        $(this).val($(this).val().replace(/[^0-9.]/g, ''));

        var value = $(this).val();

        if (value > 99999) {

            $(this).val(99999);

        }

    });</code>

從審查元素上看,我懷疑是 出售清單同一位置的出售歷史 覆蓋了當前的資訊。
從原始碼看,我感覺是有一個AJAX還是JS渲染的過程。
作為一個小白,實在不知道該如何解決該問題,還勞請大神們賜教。

PHPzPHPz2849 天前1286

全部回覆(1)我來回復

  • 给我你的怀抱

    给我你的怀抱2017-05-18 10:57:01

    雷雷

    回覆
    0
  • 取消回覆