Ajax爬取动态数据和HTTPS自动默认证书

人盡茶涼 提交于 2020-02-03 21:50:10

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())

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!