昨日内容回顾
-
爬取红牛分公司数据
1.正则表达式的使用 2.bs4模块
-
列表生成式
# 仅仅是为了减少我们的代码书写 降低复杂度 内部原理 1.先创建一个列表 2.for循环操作对象 3.将处理好的结果一个个添加到新的列表中 简写 l1 = [11,22,33,44,55] l2 = [i for i in l1 if i > 33] 本质 new_l = [] for i in l1: if i > 33: new_l.append(i)
-
zip拉链
zip将多个列表或者元组相应位置上的数据组织成一个元组 l1 = [1,2,3,4] l2 = [11,22,33] list(zip(l1,l2)) # 以最少的为准zip
-
css选择器
1.id选择器 #d1 >>> id = 'd1' 2.class选择器 .c1 >>> class='c1' 3.后代选择器 div a >>> 找div内部所有的a 4.儿子选择器 div>a >>> 找div内部第一层级的a # 上述选择器相互之间可以混用
-
requests-html模块
1.跟requests模块同一个作者 2.比requests功能更加强大 支持运行js代码 操作更加简便
-
爬去链家二手房案例
# 写代码一定要有自己的思路昂=-= 爬虫操作中要注意到网站url的变化 以及对url的获取
# 今日内容概要
- 爬取天气数据
```python
页面数据是通过js动态加载的
-
爬取汽车之家
-
selenuim模块
能够控制浏览器去访问网站
-
利用selenium爬取京东数据
今日内容详细
爬取天气数据
'''
某些网站的数据并不是一次加载完成的,点击后网址并未发生变化,实际上却是通过了后台js动态加载了数据
'''
列: 天气数据http://tianqi.2345.com/wea_history/60010.htm
1.点击查看以往月份天气数据,页面URL未发生变化
数据是通过内部js代码动态请求数据加载
2.如何查看内部js代码
network
再次发送请求
查看js文件
筛选出可以的url,尝试着勇气发送求情看起响应结果
3.根据获取的url寻找变化规律
http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2020&date%5Bmonth%5D=12
4.朝上述url发送get请求获取json数据之后解析出天气数据
import requests
res = requests.get('http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2020&date%5Bmonth%5D=11')
json_dict = res.json() # 相当于是浏览器自动帮你解析数据
real_data = json_dict.get('data')
# print(real_data)
import pandas as pd
# 当需要从table标签中筛选出数据 使用pandas里面的方法最为方便
ret = pd.read_html(real_data)
df = ret[0]
df.to_excel(r'tianqi.xlsx')
爬取汽车之家
1.直接尝试发送get请求
2.使用bs4模块筛选数据
import requests
from bs4 import BeautifulSoup
# proxies = {
# 'http': '221.10.217.26:4261',
# 'http': '110.88.31.173:4278',
# 'http': '218.6.105.99:4206',
# }
res = requests.get('https://www.autohome.com.cn/news/',
# proxies=proxies
)
soup = BeautifulSoup(res.text, 'lxml')
# 先整体后局部
ul = soup.find(name='ul', class_='article') # 先获取所有文章数据所在的ul标签
# 分析页面结构得知每一篇文章就是ul里面的一个个li标签
li_list = ul.find_all(name='li') # [文章数据1,文章数据2,...]
# for循环依次获取每一篇文章所在的li标签之后筛选出需要的数据
for li in li_list:
# 文章标题
h3 = li.find(name='h3')
if h3:
print(h3.text)
selenium模块
它最初是一个测试工具,之所以拿来使用是因为它可以弥补requests模块无法执行js文件的短板
注意
如果你想通过该模块操作你电脑上面的浏览器
你需要提前下载好相关浏览器的驱动,针对不同的浏览器需要下载不同的驱动
而我们开发一般都是使用谷歌浏览器,所以下载谷歌驱动即可
下载驱动的网址
http://npm.taobao.org/mirrors/chromedriver/2.38/
下载之后解压,将.exe的文件放到python解释器文件scripts文件夹内
下载模块
pip3 install selenium
查找标签
# 1、find_element_by_id 根据id找
# span = bro.find_element_by_id('form')
# print(span)
# 2、find_element_by_link_text 根据链接名字找到控件(a标签的文字)
# a = bro.find_element_by_link_text('新闻').get_attribute('href')
# print(a)
# 3、find_element_by_partial_link_text 根据链接名字找到控件(a标签的文字)模糊查询
# a = bro.find_element_by_partial_link_text('123').text
# print(a) # 类似于MySQL中的like模糊查询
# 4、find_element_by_tag_name 根据标签名
# 5、find_element_by_class_name 根据类名
# 6、find_element_by_name 根据属性名
# 7、find_element_by_css_selector 根据css选择器
案例
1.浏览器打开京东并搜索商品跳转到对应的页面
2.浏览器打开百度自动点击登录并输入用户名密码
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
bro = webdriver.Chrome()
bro.get("http://www.baidu.com") # 自动调用浏览器打开百度
bro.implicitly_wait(10) # 先忽略
# 1、find_element_by_id 根据id找
# span = bro.find_element_by_id('form')
# print(span)
# 2、find_element_by_link_text 根据链接名字找到控件(a标签的文字)
# a = bro.find_element_by_link_text('新闻').get_attribute('href')
# print(a)
# 3、find_element_by_partial_link_text 根据链接名字找到控件(a标签的文字)模糊查询
# a = bro.find_element_by_partial_link_text('123').text
# print(a) # 类似于MySQL中的like模糊查询
# 4、find_element_by_tag_name 根据标签名
# 5、find_element_by_class_name 根据类名
# 6、find_element_by_name 根据属性名
# 7、find_element_by_css_selector 根据css选择器
# 1.先找到搜索框标签
# input_ele = bro.find_element_by_id('key')
# # 2.在该input框内输入内容
# input_ele.send_keys('性感内衣')
# # 3.模拟键盘的enter键
# input_ele.send_keys(Keys.ENTER)
# 1.先查找登录的a标签
a_ele = bro.find_element_by_link_text('登录')
# 2.点击该标签
a_ele.click()
# 3.点击弹出框里面的用户名密码登录
a_html = bro.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn')
a_html.click()
time.sleep(1)
# 4.查找获取用户用户名和密码的input框 分别输入内容
username_ele = bro.find_element_by_id('TANGRAM__PSP_11__userName')
username_ele.send_keys('15617628568')
password_ele = bro.find_element_by_id('TANGRAM__PSP_11__password')
password_ele.send_keys('jason123')
time.sleep(1)
# 5.查找登录按钮 点击登录
submit_ele = bro.find_element_by_id('TANGRAM__PSP_11__submit')
submit_ele.click()
time.sleep(10)
bro.close() # 自动关闭浏览器页面
延时等待
"""
代码的运行速度是非常快的
但是有时候我们在打开网页的时候由于网速等各种原因导致页面还没有完全加载出来
但是代码已经运行到最后了,那么这种情况下会经常出现代码报错的情况
"""
显式等待和隐式等待
# 隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
# browser.implicitly_wait(10) 表示等待所有,
# 显式等待:显式地等待某个元素被加载
# wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))
'''我们一般情况下都是使用隐式等待,你直接在代码上拷贝即可'''
异常处理
异常其实就是代码运行过程中产生了无法解决的问题从而导致整个程序的终止(bug)
错误的三个提示
1.错误的位置
2.错误的类型
3.错误的原因
错误总共分为两大类
语法错误
是不能够被容忍的,一旦出现了立刻修改
逻辑错误
是可以被允许的
异常处理其实就是针对代码中可能会出现的逻辑错误,提前布局处理
try:
可能会出错的代码
except 错误类型:
解决措施
错误类型
indexerror
nameerror
keyerror
# 万能异常
exception
"""
异常处理的代码能尽量少使用就尽量少使用
并且可能会出错的代码也要做到尽可能的少
"""
获取标签数据
a_ele = bro.find_element_by_id('d1')
1.获取标签内部的文本
a_ele.text
2.获取标签的属性数据
a_ele.get_attribute('href')
常见操作
#模拟浏览器前进后退
browser.back()
browser.forward()
bro.execute_script(JS代码)
# 选项卡管理
# import time
# from selenium import webdriver
#
browser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles) #获取所有的选项卡
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(3)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.sina.com.cn')
browser.close()
作业
1.自己编写代码一次性完成某个地区连续多个月的天气数据
比如嘉定2020年1月到12月的数据
2.自己完成汽车之家新闻数据爬取
参考课上书写的思路案例