zoukankan      html  css  js  c++  java
  • Ajax爬取动态数据和HTTPS自动默认证书

    Ajax数据爬取

      在spider爬取数据的过程中,有些网页的数据是利用Ajax动态加载出来的,所以,在网页源代码中可能不会看到这一部分的数据,因此,我们需要使用另外的方式进行数据多爬取。

      以豆瓣电影的网页源码获取为例 https://movie.douban.com/ ,我们查看网页源代码,会发现网页中所包含的数据根本不在源代码中,比如查询囧妈,会显示查询结果为0。这时候我们就要注意他可能是使用Ajax进行动态加载的数据。

      F12进入开发者工具,按照下图步骤进行查看

       双击第3步骤中的链接,会发现有一些tag标签,最后会发现有一些数据包含其中。

     

      有数据的这些连接就是Ajax动态加载的结果了。下面有一个小例子进行简单的运用。

     1 '''
     2 @Description: 爬取异步加载数据——以豆瓣网为例
     3 @Version: 1.0
     4 @Autor: Montoin Yan
     5 @Date: 2020-02-01 18:18:05
     6 @LastEditors  : Montoin Yan
     7 @LastEditTime : 2020-02-03 18:50:01
     8 '''
     9 from urllib import parse
    10 from urllib.request import urlopen,Request
    11 import simplejson
    12 import random
    13 
    14 #设置多个请求头,防止被反扒措施进行拦截
    15 ua_list = [
    16     "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
    17     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36",
    18     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362",
    19     "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"
    20 ]
    21 #随机pick one
    22 ua = random.choice(ua_list)
    23 
    24 #以https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=10&page_start=0 为例
    25 #将链接进行分割,将Ajax需要传递的参数存储到字典中
    26 url = "https://movie.douban.com/j/search_subjects"
    27 d = {
    28     'type':'movie',
    29     'tag':'热门',
    30     'page_limit':'10', 
    31     'page_start':'0'
    32 } 
    33 request = Request('{}?{}'.format(url,parse.urlencode(d)),headers={
    34     'User-agent':ua
    35 })
    36 
    37 with urlopen(request) as response:
    38     subjects = simplejson.loads(response.read())
    39     print(len(subjects['subjects']))
    40     s = subjects['subjects']
    41     for i in s:
    42         print(i)

      结果可以参照以下内容:


     HTTPS跳过证书验证

      引用python自带的ssl库,进行不信任证书的忽略,以12306为例。

     1 '''
     2 @Description: HTTPS利用SSL库进行默认信任证书的模拟
     3 @Version: 1.0
     4 @Autor: Montoin Yan
     5 @Date: 2020-02-03 20:18:52
     6 @LastEditors  : Montoin Yan
     7 @LastEditTime : 2020-02-03 20:32:47
     8 '''
     9 
    10 from urllib.request import urlopen,Request
    11 import random
    12 import ssl
    13 
    14 url = "http://www.12306.cn/mormhweb/"
    15 ua_list = [
    16     "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
    17     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36",
    18     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362",
    19     "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"
    20 ]
    21 #随机pick one
    22 ua = random.choice(ua_list)
    23 request = Request(url,headers={
    24     'User-agent':ua
    25 })
    26 
    27 #忽略不信任的证书
    28 context = ssl._create_unverified_context()
    29 
    30 #利用urlopen的最后一个参数,强调上下文使得在链接传递的时候忽略证书
    31 with urlopen(request,context=context) as response:
    32     print(response._method)
    33     print(response.read())
  • 相关阅读:
    eureka_feign学习_1
    九度 题目1183:守形数----------------我用的方法自创
    题目1179:阶乘-------------阶乘不用long long int 就不能AC
    题目1177:查找---------------字符串的函数问题
    题目1170:找最小数-------------------------------找最小值,中间值应该初始化为最大值
    题目1169:比较奇偶数个数-----------------------------这个世界不是奇数就是偶数l
    题目1075:斐波那契数列
    题目1070:今年的第几天?---------关键是闰年的判断
    题目1068:球的半径和体积----------------------------arccos(-1)要用c语言中的acos(-1)代替
    题目1067:n的阶乘--------long long int
  • 原文地址:https://www.cnblogs.com/yandashan666/p/12257348.html
Copyright © 2011-2022 走看看