Day 21
一、数据接口
在网页数据面打开检查,利用精确定位标签对应网页源代码的位置,在点击network ,可以通过改按钮获取浏览器信息、cookie信息,并且找到数据接口
- 实例:获取英雄联盟所有英雄姓名
import requests
response = requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js')
result = response.json()
for x in result['hero']:
print(x['name'])
二、selenium的基本用法
1. 创建浏览器对象(浏览器对象如果是全局变量,浏览器不会自动关闭)
from selenium.webdriver import Chrome
b = Chrome()
2. 打开网页(你需要爬的数据在哪个网页里面,就打开哪个网页)
b.get('https://movie.douban.com/top250')
3. 获取网页源代码(获取到的一定是页面中加载出来的)
print(b.page_source)
3. 获取网页源代码(获取到的一定是页面中加载出来的)
b.close()
二、selenium控制浏览器的基本行为
- 此处以某东作为示例
b = Chrome()
b.get('https://www.jd.com')
1.输入框输入内容
- 利用代码在目标网站进行伪人类操作,如在输入框输入想要搜索的内容
- 1)找到输入框:需要自身对网页进行解析,找到输入框对应的标签,并且获取。
input_tag = b.find_element_by_id('key')
- 2)输入框输入内容:在找到输入框对应的标签后,赋予变量,并使用 输入框.send_keys方法输入想要搜索的内容即可,注意需要在文本内容最后加\n,意思代表回车。
input_tag.send_keys('电脑\n')
print(b.page_source)
- 点击标签
- 在网页上实现点击功能,同上也需要找到需要点击按钮对应的标签,使用 按钮标签.click()方法实现点击命令。
btn = b.find_element_by_css_selector('#navitems-group2 .b')
btn.click()
练习:利用输入框和点击完成对需要商品的搜索和点击下一页,并将这两页数据持久化
from selenium.webdriver import Chrome
from time import sleep
from bs4 import BeautifulSoup
import csv
import lxml
f = open('files/手机数据.csv', 'w', encoding='utf-8')
writer = csv.writer(f)
writer.writerow(['商品','价格'])
def analysis_data(html: str):
soup = BeautifulSoup(html,'lxml')
all_iphone = soup.select('#J_goodsList>ul>li>div.gl-i-wrap')
# print(all_iphone)
phone = []
for iphone in all_iphone:
name = iphone.select_one('.p-name em').text
price = iphone.select_one('.p-price i').text
phone.append([name, price])
writer.writerows(phone)
return phone
b = Chrome()
# 1.输入框输入内容
b.get('https://www.jd.com')
# a.找到输入框标签
input_tag = b.find_element_by_id('key')
# b.在输入框输入内容
input_tag.send_keys('手机\n')
sleep(2)
# c.第一页获取手机页面数据
result = b.page_source
analysis_data(result)
sleep(2)
# # 2.点击按钮
# # 点击第二页
btn = b.find_element_by_css_selector('#J_bottomPage>span>.pn-next')
btn.click()
# 获取第二页手机页面数据
sleep(2)
result1 = b.page_source
analysis_data(result1)
f.close()
input('是否结束:')
b.close()
三、切换选项卡
- 在我们自行浏览网页时,会打开多个标签页,并且来回切换,怎么能使用代码做到呢?
1.基本操作,创建浏览器饼打开网页,在输入框输入内容,获取需要点击的所有标签: 如果拿到标签后需要点击或者输入,必须通过浏览器获取标签
from selenium.webdriver import Chrome
from time import sleep
from bs4 import BeautifulSoup
# 1. 基本操作
b = Chrome() # 创建浏览器
b.get('https://www.cnki.net/') # 打开中国*网
search_tag = b.find_element_by_id('txt_SearchText') # 获取输入框
search_tag.send_keys('数据分析\n') # 输入框输入'数据分析',然后按回车
sleep(1) # 切换界面最后做一个等待操作
# 获取需要点击的所有标签: 如果拿到标签后需要点击或者输入,必须通过浏览器获取标签
all_result = b.find_elements_by_css_selector('.result-table-list .name>a')
# 点击第一个结果(这儿会打开一个新的选项卡)
all_result[0].click()
sleep(1)
2. 切换选项卡
- 注意:selenium中,浏览器对象(b)默认指向一开始打开的选项卡,除非用代码切换,否则浏览器对象指向的选项卡不会变
- 1)获取当前浏览器上所有的窗口(选项卡): 浏览器.window_handles
- 2)切换选项卡
# 跳转到窗口(获取所有窗口)
b.switch_to.window(b.window_handles[-1])
- 3)解析内容
soup = BeautifulSoup(b.page_source, 'lxml')
result = soup.select_one('#ChDivSummary').text
print(result)
b.close() # 关闭当前指向的窗口(最后一个窗口),窗口关闭后,浏览器对象的指向不会发生改变
# 回到第一个窗口,点击下一个搜索结果
b.switch_to.window(b.window_handles[0])
all_result[1].click()
sleep(1)
b.switch_to.window(b.window_handles[-1])
soup = BeautifulSoup(b.page_source, 'lxml')
result = soup.select_one('#ChDivSummary').text
print(result)
b.close()
input('结束:')
b.close()