12.1:利用webbrowser模块
import webbrowser
webbrowser.open("http:***.com/")
打开open里的网站,这应该是webbrowser唯一能做的,是python自带的
12.2:用requests模块从web下载文件
requests不是python自带的需要下载
pip install --user requests
import requests
为出错则安装成功
12.2.1:用requests.get()函数下载一个网页
import requests
res = requests.get("http://***/")
requests.get接收一个要下载的URL字符串
12.2.2:检查错误
res = requests.get("http://***/")
res.raise_for_status()
raise_for_status()方法是当程序下载失败时停止。如果下载失败对程序不受影响可以用try和except将语句包裹起来
12.3:将下载的文件保存到硬盘
可以使用标准的open()函数和write()方法,将网页保存到硬盘的一个文件。这里使用另一种方法。
import requests
res = requests.get("http://***/")
res.raise_for_status()
playFile = open('***.txt', 'wb')
for chunk in res.iter_content(100000)
playFile.write(chunk)
playFile.close()
iter_content()方法再循环的每次迭代中返回一段内容,每一段都是bytes数据类型,需要指定一段包含多少字节。(一般是设置100000)
write()方法返回写入文件的字节数,并将数据写入到文件中。
12.4:html
(由于以前比较了解,也写过这样的纸制笔记,所有这里不做笔记了)
12.5:用bs4模块解析HTML
Beautiful Soup是一个模块,用于从HTML页面中提取信息。Beautiful Soup模块名称是bs4,需要安装,安装是使用名字是beautifulsoup4但导入它就使用bs4
pip install beautifulsoup4
import bs4
12.5.1:从HTML创建一个BeautifulSoup对象
import requests, bs4
res = requests.get("html://***/")
res.raise_for_status()
noStarchSoup = bs4.BeautifulSoup(res.text, 'html.parser')
type(noStarchSoup)
exampleFile = open('example.html')
exampleSoup = bs4.BeautifulSoup(exampleFile , 'html.parser')
type(exampleSoup )
bs4.BeautifulSoup()函数调用时需要一个字符串,其中包含将要解析的HTML,函数返回一个BeautifulSoup对象。bs4.BeautifulSoup()也可以传递一个file对象,以及第二个参数告诉BeautifulSoup使用哪个解析器来解析
这里'html.parser'解析器是python自带的,但如果你安装了第三方lxml模块也可以使用更快的'lxml'解析器
pip install --user lxml
12.5.2:用select()方法寻找元素
select()方法返回一个Tag对象列表。
import bs4
exampleFile = open("example.html")
exampleSoup = bs4.BeautifulSoup(exampleFile.read(), 'html.parser')
elems = exampleSoup.select('#author')
type(elems)
# 返回<class 'list>
len(elems)
# 返回 1
type(elems[0])
# 返回<class 'bs4.element.Tag>
str(elems[0])
# 返回<span id="author">Al Sweigart</span>
elems[0].getText()
# 返回 'Al Sweigart'
elems[0].attrs
# 返回 {'id':'author'}
len(elems):上诉代码列表中只有一个Tag对象,只有一次匹配
getText():返回该元素的文本(就是标签里的内容)
attrs:返回所有HTML属性作为一个字典
将元素传递给str(),返回一个字符串,包含该元素的开始和结束标签
传递给select()方法的选择器 | 将匹配 |
---|---|
soup.select('div') | 所有<div>元素 |
soup.select('#author') | 带id属性为author的元素 |
soup.select('.notice') | 所有类名为notice的元素 |
soup.select('div span') | 所有在<div>之内的<span>元素 |
soup.select('div > span') | 所有在<div>之内的<span>元素,中间没有其他元素 |
soup.select('input[name]') | 所有<input>,并有一个name属性,值无所谓的元素 |
soup.select('input[type="button"]') | 所有<input>,并有一个type属性,其值为button的元素 |
12.5.3:通过元素属性获取数据
import bs4
soup = bs4.BeautifulSoup(open('example.html'), 'html.parser')
spanElem = soup.select('span')[0]
str(spanElem)
# 返回 '<span id="author">Al Sweigart</span>
spanElem.get('id')
# 返回 'author'
spanElem.get('some_nonexistent') == None
# 返回 True
spanElem.attrs
# 返回 {'id':'author'}
get()方法可以从元素中获取属性值,向方法传递一个属性名称就能返回属性值
12.6:项目(打开所有搜索结果)
import requests, sys, webbrowser, bs4
print('开始')
res = requests.get('https://***/'+''.join(sys.argv[1:])) # 通过命令行参数指定查询主题
res.raise_for_status() # 检查文件下载是否出错
soup = bs4.BeautifulSoup(res.text, 'html.parser')
linkElems = soup.select('.package-snippet') # 查询类名为package-snippet的元素
numOpen = min(5, len(linkElems)) # 将最大查询数设置为5
for i in rang(numOpen):
urlToOpen = 'html://***/' + linkElems[i].get('href') # 将元素中href的值与其拼接
print('Opening', urlToOpen)
webbrowser.open(urlToOpen) # 打开所得到的连接
12.7:项目下载所有XKCD漫画
import requests, os, bs4
url = 'http://***/' # 连接地址
os.makedirs('xkcd', exist_ok=True) # 创建下载到新的文件夹
while not url.endswith('#'):
print('下载页面: %s' % url)
res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
comicElem = soup.select('#comic img')
if comicUrl == []:
print('不能下载图像')
else:
comicUrl = 'https:' + comicElem[0].get('src')
print('下载图片 %s' % (comicUrl))
res = requests.get(comicUrl)
res.raise_for_status()
imageFile = open(os.path.join('xkcd', os.path.basename(comicUrl)), 'wb')
for chunk in res.iter_content(100000):
imageFile.write(chunk)
imageFile.close()
prevLink = soup.select('a[rel="prev"]')[0]
url = 'http://***/' + prevLink.get('href')
print('Done.')
12.8:用selenium模块控制浏览器
selenium模块可以让python直接控制浏览器
12.8.1:启动selenium控制的浏览器
pip install --user seleniumf
安装selenium模块
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://***/')
webdriver.Firefox():是启用火狐浏览器也可以用其他的。
get()方法将浏览器指定网站
12.8.2:在页面中寻找元素
from selenium import webdriver
browser = webbriver.Firefox()
browser.get('http://***/')
try:
elem = browser.find_element_by_class_name('cover-thumb')
print('元素%s的类名' % (elem.tag_name))
except:
print('未找到类名')
selenium的WebDriver方法,用于寻找元素
方法名 | 返回的WebEkement对象/列表 |
browser.find_element_by_class_name(name) browser.find_elements_by_class_name(name) | 使用CSS类名的元素 |
browser.find_element_by_css_selector(selector) browser.find_elements_by_css_selector(selector) | 匹配CSS selector的元素 |
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) | 完全匹配提供的文本的元素 |
browser.find_element_by_partial_link_text(name) browser.find_elements_by_partial_link_text(name) | 包含提供的文本的元素 |
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) | 匹配标签(大小写不敏感) |
除了*_by_tag_name()方法其他的都区分大小写。如果页面上没有可匹配的元素selenium模块就会抛出NoSuchElement异常。尽量将代码放在try和except中。
有了WebElement对象就可以调用以下方法
属性或方法 | 描述 |
tag_name | 表示标签名,例如<a>元素的标签名是‘a’ |
get_attribute(name) | 返回该元素name的值 |
text | 表示该元素内的文本,例如<p>hello</p>中的hello |
clear() | 对文本字段或文本区域元素,清除其中输入的文本 |
is_displayed() | 判断是否是可见元素,可见为True,不可见为False |
is_enabled() | 对输入元素是否启用,启用为True,未启用为False |
is_selected() | 对单选按钮或复选框是否选中,选中为True,为选中为False |
location | 一个字典,包含键的'x'和'y',表示该元素在页面上的位置 |
12.8.3:单击页面
from selenium import webdriver
browser = webbriver.Firefox()
browser.get('http://***/')
linkElem = browser.find_element_by_link_text('Read Onlink for Free')
linkElem.click()
click()方法用于模拟单击这个元素
12.8.4:填写提交表单
from selenium import webdriver
browser = webbriver.Firefox()
browser.get('http://***/')
userElem = browser.find_element_by_id('user_name')
userElem.send_keys('your_real_username_here')
passwordElem = browser.find_element_by_id('user_pass')
passwordElem.send_keys('your_real_password_here')
passwordElem.submit()
send_keys():将信息输入到所在元素中
在任何元素上调用submit()方法,都等同于单击该元素所在表单的submit按钮
12.8.5:发送特殊键
属性 | 含义 |
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键和Delete键 |
Keys.F1, Keys.F2,......, Keys.F12 | F1到F12键 |
Keys.TAB | Tab键 |
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webbriver.Firefox()
browser.get('http://***/')
htmlElem = browser.find_element_by_tag_name('html')
htmlElem.send_keys(Keys.END)
htmlElem.send_keys(Keys.HOME)
12.8.6:单击浏览器按钮
browser.back() 单击“返回”按钮
browser.forward() 单击“前进”按钮
browser.refresh() 单击“刷新”按钮
browser.quit() 单击“关闭窗口”按钮