Day05笔记*****************************
1、json模块
1、什么是json?(数据传输的格式)
javascript中的对象和数组
对象 :{key:value} 取值:对象名.key
数组 :[...,...] 取值:数组[索引值]
2、作用
json格式的字符串 和 Python数据类型 之间的转换
3、常用方法
1、json.loads() : json格式 --> Python数据类型
json python
对象 ——> 字典
数组 ——> 列表
见 01_json.loads示例.py
2、json.dumps() : Python数据类型 --> json格式
python json
字典 对象
列表 数组
元组 数组
## 注意
1、json.dumps()在序列化时默认使用ascii编码
2、添加参数ensure_ascii=False,表示禁用ascii编码
'''01_json.loads实例'''
import json
#json格式的数组
jsarray = '[1,2,3,4]'
#数组->列表
L = json.loads(jsarray)
print(type(L),L)
#json格式对象
jsobj = '{"city":"天地会","name":"步惊云"}'
#对象->字典
D = json.loads(jsobj)
print(type(D),D)
结果:
"""
Created on Wed Sep 18 23:48:05 2019
@author: aa
"""
'''02_json.dumps实例'''
import json
L = [1,2,3,4]
T = (1,2,3,4)
D = {"city":"天地会","name":"逆风"}
#python格式 ->json格式
jsarry1 = json.dumps(L)
print(type(jsarry1),jsarry1)
jsarry2 = json.dumps(T)
print(type(jsarry2),jsarry2)
jsaobj = json.dumps(D,ensure_ascii = False)
print(type(jsaobj),jsaobj)
2、动态网站数据抓取 - Ajax
1、特点 :滚动鼠标滑轮时加载
2、案例 :豆瓣电影排行榜数据抓取
1、抓取目标 :豆瓣电影 - 排行榜 - 剧情
电影名称 、评分
2、代码实现
'''03_豆瓣电影抓取-Ajax.py'''
import requests
import json
import csv
# url要写抓到的GET :URL
url = "https://movie.douban.com/j/chart/top_list?"
headers = {"User-Agent":"Mozilla/5.0"}
num = input("请输入要爬取的数量:")
params = {
"type":"11",
"interval_id":"100:90",
"action":"",
"start":"0",
"limit":num
}
res = requests.get(url,params=params,headers=headers)
res.encoding = "utf-8"
# html为json格式的数组[{电影1信息},{},{}]
html = res.text
# 数组 -> 列表
html = json.loads(html)
# 用for循环遍历每一个电影信息{}
for film in html:
name = film['title']
score = film["rating"][0]
#{"rating":["9.6","50"],...}
with open("豆瓣电影.csv","a",newline="") as f:
writer = csv.writer(f)
L = [name,score]
writer.writerow(L)
这里需要注意的就是这个使用get的url,因为我的Fiddler 无法安装证书,所以拿不到get的url,这个url是老师上课讲的。
'''03_豆瓣电影抓取-Ajax.py'''
import requests
import json
import csv
# url要写抓到的GET :URL
url = "https://movie.douban.com/j/chart/top_list?"
headers = {"User-Agent":"Mozilla/5.0"}
L = ["剧情","喜剧","动作"]
tp_list = [{"剧情":"11"},{"喜剧":"24"},{"动作":"5"}]
tp = input("请输入电影类型:")
if tp in L:
num = input("请输入要爬取的数量:")
for film_dict in tp_list:
for key,value in film_dict.items():
if tp == key:
params = {
"type":value,
"interval_id":"100:90",
"action":"",
"start":"0",
"limit":num
}
res = requests.get(url,params=params,headers=headers)
res.encoding = "utf-8"
# html为json格式的数组[{电影1信息},{},{}]
html = res.text
# 数组 -> 列表
html = json.loads(html)
# 用for循环遍历每一个电影信息{}
for film in html:
name = film['title']
score = film["rating"][0]
#{"rating":["9.6","50"],...}
with open("豆瓣电影.csv","a",newline="") as f:
writer = csv.writer(f)
L = [name,score]
writer.writerow(L)
else:
print("您输入的类型不存在!")
3、selenium + phantomjs 强大的网络爬虫组合
1、selenium
1、定义 :Web自动化测试工具,应用于Web自动化测试
2、特点
1、可以运行在浏览器,根据指定命令操作浏览器,让浏览器自动加载页面
2、只是工具,不是浏览器,不支持浏览器功能,需要与第三方浏览器结合使用
2、phantomjs
1、定义 :无界面浏览器(无头浏览器)
2、特点
1、把网站加载到内存进行页面加载
2、运行高效
3、安装
1、Windows
1、将下载的可执行文件放到Python安装目录的Scripts目录下
C:\Python36\Scripts
安装:
chromedriver.exe
phantomjs.exe
2、Ubuntu
1、将下载的phantomjs放到一个路径下
2、添加环境变量:
vi .bashrc 添加
export PHANTOM_JS=/home/.../phantomjs-2.1.1-...
export PATH=$PHANTOM_JS/bin:$PATH
终端:source .bashrc
终端:phantomjs
我在phantomjs官网上无法下载phantomjs.exe,所以就没有安装,只是安装了chromedriver.exe
3、示例代码
1、示例代码1 : 见05_phantomjs+selenium示例1.py
'''05_phantomjs+selenium示例1.py'''
from selenium import webdriver
#创建一个chromjs浏览器对象
driver = webdriver.Chrome()
#发请求
driver.get("http://www.baidu.com/")
#获取响应的html源码
print(driver.page_source)
#获取网页截屏
driver.save_screenshot("百度.png")
#print("图片保存成功")
##关闭
driver.quit()
2、示例代码2 : 见06_phantomjs+selenium示例2.py
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 20 00:01:39 2019
@author: aa
"""
#06_phantomjs+selenium示例2.py
from selenium import webdriver
import time
#创建浏览器对象
driver = webdriver.Chrome()
#打开页面
driver.get("http://www.baidu.com/")
#发送文字到搜索框
kw = driver.find_element_by_id("kw")
kw.send_keys("易烊千玺")
#点击“百度一下”
su = driver.find_element_by_id("su")
su.click()
time.sleep(1)
#获取截屏
driver.save_screenshot("千玺.png")
#关闭浏览器
driver.quit()
这个很好玩,你什么都不用干,感觉浏览器可以听懂你的话,搜索—>百度一下—>保存图片
大佬的图片就是赏心悦目
4、常用方法
1、driver.get(url)
2、driver.page_source : 获取响应的html源码(有用)
3、driver.page_source.find("字符串")
1、作用 :从html源码中搜索指定字符串
-1 :查找失败
非-1 :查找成功
4、单元素查找
1、driver.find_element_by_id("").text(获取节点里面的文本内容)
2、driver.find_element_by_class_name("")
3、driver.find_element_by_xpath('xpath表达式')
4、如果匹配到多个节点,则只返回第1个节点对象
5、多元素查找
1、driver.find_elements_by_....
2、注意
1、如果结果1个,则返回节点对象,不是列表
2、如果结果N个,则返回列表,;列表里的每个对象就是节点元素
3、示例见 :08_driver.find查找元素示例.py
6、对象名.send_keys("内容")
7、对象名.click()
5、案例1 :登录豆瓣网站
见 :09_selenium+Chrome登陆豆瓣案例.py
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 20 19:35:05 2019
09_selenium+Chrome登陆豆瓣案例
@author: aa
"""
from selenium import webdriver
import time
#创建浏览器对象,发请求
driver = webdriver.Chrome()
driver.get("https://www.douban.com/")
time.sleep(0.5)
#获取截图(验证码)
driver.save_screenshot("验证码.png")
#找用户名、密码、验证、登录豆瓣按钮
#用户名
uname = driver.find