Ajax网页爬取

Ajax网页,指的是类似豆瓣电影排行这样的页面。


  • 鼠标拉到最下面时,会自动加载;
  • 同时,网页的url没有改变;

https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=


Ajax动态网页,是通过GET的方式,将表单发送给服务器。返回的是json格式的文件。


法一:使用提交表单的方式


对于这样的网页,我们可以查看抓取到的网页


Ajax网页爬取_第1张图片


可以看到,在Query String Parameters中,有5个字段,对比各个网页中的该字段,


可以发现,网页加载时,只有start字段在20,20地往上增加。


#coding:utf-8  
import urllib.request    
import urllib.error
import urllib.parse
  
"""一、添加header"""  
#1.1、以字典的形式设置headers  
header={  
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0",     
    }  
#header常见字段有7个,除上述5个外,还有Host,Accept-Encoding
#header用字典的原因是,可以轻松地更改某个字段的值  
#referer字段:一般为要爬取的网页的域名地址或对应网站的主页地址
#Accept-Encoding字段:浏览器支持的压缩编码
#Host字段:服务器网址

#这里的URL是在network中抓到的URL,不是浏览器上方的URL
web_url= "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action="  
  
postData = urllib.parse.urlencode({
    "start":"0",
    "limit":"20"
    }).encode('utf-8')
#encode:将Unicode码转为utf-8码

req = urllib.request.Request(url=web_url,
                             data=postData,
                             headers=header
                             )

try:  
    response = urllib.request.urlopen(req, timeout=3)  
except urllib.error.URLError as e:  
    if hasattr(e, 'code'):  
        print(e.code)  
    if hasattr(e, 'reason'):  
        print(e.reason)  
else:          
    webData=response.read().decode('utf-8')

print(webData)



法二:使用URL直接爬取


通过对network中URL的分析:


https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=20&limit=20


https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=40&limit=20


我们可以看到start字段是不一样的,故可以通过叠加start字段的值的方法,直接访问。


#coding:utf-8  
import urllib.request    

"""一、添加header"""  
#1.1、以字典的形式设置headers  
header={  
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0",     
    }  
#header常见字段有7个,除上述5个外,还有Host,Accept-Encoding
#header用字典的原因是,可以轻松地更改某个字段的值  
#referer字段:一般为要爬取的网页的域名地址或对应网站的主页地址
#Accept-Encoding字段:浏览器支持的压缩编码
#Host字段:服务器网址

#这里的URL是在network中抓到的URL,不是浏览器上方的URL
web_url= "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=40&limit=20"  

req = urllib.request.Request(url=web_url,
                             headers=header
                             )

response = urllib.request.urlopen(req, timeout=3)         
webData=response.read().decode('utf-8')

print(webData)


最后


我们可以将返回的json,通过https://www.json.cn/来显示


Ajax网页爬取_第2张图片


你可能感兴趣的:(爬虫)