1. 操作浏览器
1.1 打开浏览器并加载网页
import webbrowser
webbrowser.open('https://github.com/ChelseaMah')
1.2 用selenium模块控制浏览器
导入有点特殊,需要用
from selenium import webdriver
来使用selenium的webdriver,而不是Python自带的。
1.2.1 启动浏览器
from selenium import webdriver
browser = webdriver.Safari()
browser.get('https://github.com/ChelseaMah')
1.2.2 在页面中寻找元素
WebDriver对象有很多方法在页面中寻找元素,分为findelement和findelements方法。
findelemen 返回一个WebElement对象,是匹配查询的第一个元素。
findelements 返回一个列表,包含所有匹配元素。
方法 | return |
---|---|
browser.find_element_by_class_name(name) browser.find_elements_by_class_name(name) |
使用CSS类name的元素 |
browser.find_element_by_css_selector(selector) browser.find_elements_by_css_selector(selector) |
匹配CSSselector的元素 |
browser.find_element_by_id(id) browser.find_elements_by_id(id) |
匹配id属性值的元素 |
browser.find_element_by_link_text(text) browser.find_elements_by_link_text(text) |
完全匹配提供的text的<a>元素 |
browser.find_element_by_partial_link_text(text) browser.find_elements_by_partial_link_text(text) |
包含提供的text的<a>元素 |
browser.find_element_by_name(name) browser.find_elements_by_name(name) |
匹配name属性值的元素 |
browser.find_element_by_tag_name(name) browser.find_elements_by_tag_name(name) |
匹配标签name的元素(大小写无关,<a>元素匹配'a'和'A') |
1.2.3 WebElement的属性和方法:
属性或方法 | 描述 |
---|---|
tag_name | 标签名,例如'a'表示<a>元素 |
get_attribute(name) | 该元素name属性的值 |
text | 该元素内的文本,例如<span>hello</span>中的'hello' |
clear() | 对于文本字段或文本区域元素,清除其中输入的文本 |
is_displayed() | 如果该元素可见,返回True,否则返回False |
is_enabled() | 对于输入元素,如果该元素启用,返回True,否则返回False |
is_selected() | 对于复选框或单选框元素,如果该元素被选中,选择True,否则返回False |
location | 一个字典,包含键'x'和'y',表示该元素在页面上的位置 |
1.2.4 页面点击
- findelement或findelements方法找到该WebElement对象
- 调用该元素的click()方法。
from selenium import webdriver
browser = webdriver.Safari()
browser.get('https://github.com/ChelseaMah')
publicElement = browser.find_element_by_link_text('Public')
publicElement.click()
1.2.5 填写并提交表单
from selenium import webdriver
browser = webdriver.Safari()
browser.get('http://gmail.com')
emailElem = browser.find_element_by_id('Email')
emailElem.send_keys('not_my_real_email@gmail.com')
passwordElem = browser.find_element_by_id('Passwd')
passwordElem.send_keys('12345')
passwordElem.submit()
在任何元素上调用submit(),都等同于该元素所在表单的submit。
1.2.6 发送特殊键
针对不能用字符串值输入的键盘击键,如Shift、F1、Home等,使用send_keys()方法时,传入selenium.webdriver.common.keys模块的常量:
属性 | 含义 |
---|---|
Keys.DOWN,Keys.UP,Keys.LEFT,Keys.RIGHT | 键盘箭头键 |
Keys.ENTER,Keys.RETURN | 回车和换行键 |
Keys.HOME,Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP | Home键、End键、PageUp键和PageDown键 |
Keys.ESCAPE,Keys.BACK_SPACE,Keys.DELETE | Esc、Backspace和字母键 |
Keys.F1,Keys.F2,...,Keys.F12 | 键盘顶部的F1到F12键Keys.TABTab键 |
1.2.7 点击浏览器按钮
- browe.back() 点击"返回"
- browe.forword() 点击"前进"
- browe.refresh() 点击"刷新"
2. resquests模块完成网络请求、文件下载
2.1 请求网络数据
import bs4,requests
# res的类型为requests.models.Response
res = requests.get("https://github.com/ChelseaMah")
# 回去状态码
if res.status_code = requests.code.ok:
# 获取网页请求内容
content = bs4.BeautifulSoup(res.text)
print (content)
2.2 检查错误
在Response对象上调用raise_for_status()方法。如果下载文件出错,将抛出异常。如果下载成功,就什么也不做。
import bs4,requests
# res的类型为requests.models.Response
res = requests.get("https://github.com/ChelseaMah")
try:
res.raise_for_status()
# 回去状态码
if res.status_code = requests.code.ok:
# 获取网页请求内容
content = bs4.BeautifulSoup(res.text)
print (content)
except requests.exceptions.HTTPError as e:
print('网络请求失败, msg' + str(s))
2.3 将下载的文件保存到硬盘
从Web写入本地文件时,可以用标准的open()函数和write()方法。 但必须用“写二进制”模式打开该文件,即向函数传入字符串'wb',作为open()的第二参数。 即使该页面是纯文本的,你也需要写入二进制数据,而不是文本数据,目的是为了保存该文本中的“Unicode编码”。
import bs4,requests
try:
res = requests.get('https://github.com/ChelseaMah/algorithm_practice/blob/master/src/group2/group.md')
res.raise_for_status()
playFile = open('group.md', 'wb')
for chunk in res.iter_content(100000):
playFile.write(chunk)
playFile.close()
except requests.exceptions.HTTPError as e:
print('网络请求失败, msg' + str(s))
3. HTML解析
用BeautifulSoup模块解析HTML
3.1 创建BeautifulSoup对象
bs4.BeautifulSoup(htmlStr/file)返回一个BeautifulSoup对象,htmlStr中包含将要解析的HTML。也可以向bs4.BeautifulSoup()传递一个File对象,从硬盘加载一个HTML文件。
从网络获取html
res = requests.get('https://github.com/ChelseaMah')
res.raise_for_status()
b4s = bs4.BeautifulSoup(res.text)
读取本地文件
file = open('example.html')
b4s = bs4.BeautifulSoup(file)
有了BeautifulSoup以后就可以利用它的方法,定位HTML文档中特定的部分。
3.2 select() 方法 获取元素数据
CSS选择器例子
方法 | 匹配 |
---|---|
soup.select('div') | 所有<div>的元素 |
soup.select('#author') | 带有id属性为author的元素 |
soup.select('.notice') | 所有使用CSSclass属性名为notice的元素 |
soup.select('divspan') | 所有在<div>元素之内的<span>元素 |
soup.select('div>span') | 所有直接在<div>元素之内的<span>元素,中间没有其他元素 |
soup.select('input[name]') | 所有名为<input>,并有一个name属性,其值无所谓的元素 |
soup.select('input[type="button"]') | 所有名为<input>,并有一个type属性,其值为button的元素 |
不同的选择器模式可以组合起来,形成复杂的匹配。例如,soup.select('p#author')将匹配所有id属性为author的元素,只要它也在一个<p>元素之内。
select()方法将返回一个Tag对象的列表。每个Tag表示BeautifulSoup对象中的HTML的每次匹配。
Tag值可以传递给str()函数,显示它们代表的HTML标签。
Tag值也可以有attrs属性,它将该Tag的所有HTML属性作为一个字典。
>>> import bs4
>>> exampleFile = open(' example. html')
>>> exampleSoup = bs4.BeautifulSoup(exampleFile.read())
>>> elems = exampleSoup.select('#author')
>>> type(elems)
< class 'list'>
>>> len(elems)
1
>>> type(elems[ 0])
< class 'bs4.element.Tag'>
>>> elems[0].getText()
'Al Sweigart'
>>> str(elems[ 0])
'<span id="author">Al Sweigart</span>'
>>> elems[ 0].attrs
{'id': 'author'}
>>> spanElem = exampleSoup.select('span')[0]
>>> spanElem.get('id')
'author'
>>> spanElem.get('some_nonexistent_addr') == None
True