(一)Ajax基础

1.简介

* AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)
* AJAX 不是新的编程语言,而是一种使用现有标准的新方法
* AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下
* AJAX 可以用于创建快速动态的网页
* AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术
2.AJAX 工作原理

如图所示:




1.AJAX是基于现有的Internet标准,并且联合使用它们:

* XMLHttpRequest 对象 (异步的与服务器交换数据)
* JavaScript/DOM (信息显示/交互)
* CSS (给数据定义样式)
3.参考:AJAX 教程 <https://www.w3cschool.cn/ajax/ajax-tutorial.html>

4.Python采集Ajax和动态HTML数据的两种方法:

* 直接从javascript代码中采集内容
* 用python的第三方库运行javascript,比如(Selenium)
(二)爬取豆瓣电影,解决动态加载问题

参考博客:DataCastle博客 <http://blog.csdn.net/datacastle/article/details/78812575>

以豆瓣励志分类下的电影为例链接为:
https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=%E5%8A%B1%E5%BF%97
<https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=%E5%8A%B1%E5%BF%97>



首先要告诉你的是,这种动态加载的页面,一般数据会在Network的 JS或者 XHR 类目里。


打开动态加载的json文件:鼠标右击>检查>network>XHR>选中url>鼠标右击>open in new
tab,浏览器打开后的json文件格式比较乱,在Chrome浏览器上安装jsonview插件格式化json文件。

加载了两次,不出意料地又加载出了两页 XHR 信息,于是,满怀期待地分别打开它们。新加载的两个页面,和网页显示的电影信息完全相同。




1.XHR 加载的这几个页面的 url:
#第二页 https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10
&tags=&start=20 #第三页 https://movie.douban.com
/j/new_search_subjects?sort=T&range=0,10&tags=&start=40 #第四页 https://movie
.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=60
注:start数据的变化成等差数列
2.使用start数据的变化,遍历页面爬取数据:
for a in range(3): url=
'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'
.format(a*20) # 用 a*20 表示每个页面按 20 的步长递增,只示例3个页面,你可以按需求增加。
3.根据规律可以爬取任意页的数据,下面演示爬取前10次加载的数据:
import requests import time count=0 #定义count变量统计爬取电影总数 for a in range(10):
url_visit =
'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'
.format(a*20) file = requests.get(url_visit).json() #这里跟之前的不一样,因为返回的是 json 文件
time.sleep(2) for i in range(20): dict=file['data'][i] #取出字典中 'data' 下第 [i]
部电影的信息 urlname=dict['url'] title=dict['title'] rate=dict['rate'] cast=dict[
'casts'] count+=1 print('{} {} {} {}\n'.format(title,rate,' '
.join(cast),urlname)) print("爬取的电影总数:"+str(count))
4.注意事项

01.之前我们用的 .text 是需要网页返回文本的信息,而这里返回的是 json文件所以用 .json()
file = requests.get(url).json()
02.取出字典中的值,需要在方括号中指明值对应的键
dict=file['data'][i] urlname=dict['url']
03.因为有多名演员,这里用了 join() 函数,在字符串中间加入空格分隔。
04.字符串处理方法 <http://www.runoob.com/python/python-strings.html>
' '.join(cast)
5.将数据写入CSV文件
import requests import time import csv count=0 for a in range(10): url_visit =
'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start={}'
.format(a*20) file = requests.get(url_visit).json() #这里跟之前的不一样,因为返回的是 json 文件
time.sleep(2) with open("D:\movie.csv", "w",encoding="utf-8",newline="")as f:
writer = csv.writer(f)#写入前20部电影 for i in range(20): dict = file['data'][i] #
取出字典中 'data' 下第 [i] 部电影的信息 urlname = dict['url'] title = dict['title'] rate =
dict['rate'] cast = dict['casts'] count += 1 writer.writerow((title, rate, ' '
.join(cast), urlname)) print("数据成功写入csv文件") print("爬取的电影总数:"+str(count))
结果演示:


6.使用pandas库把数据写入Excel文件
import pandas as pd names=["张三","李四","王五"] professions=["销售经理","银行经理","产品经理"]
salary=[1200,20000,15000] dic={"姓名":names,"职称":professions,"薪酬":salary} df=pd.
DataFrame(dic) df.to_excel("Test.xlsx",index=False)
结果如图所示:

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信