Python编程快速上手11章从 Web 抓取信息

webbrowser 模块

webbrowser 模块的 open()函数可以启动一个新浏览器,打开指定的 URL。

>>> import webbrowser
>>> webbrowser.open('http://inventwithpython.com/')

用 requests 模块从 Web 下载文件
用 requests.get()函数下载一个网页

>>> import requests
>>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
>>> type(res)
<class 'requests.models.Response'>
>>> res.status_ _code == requests.codes.ok
True
>>> len(res.text)
178981
>>> print(res.text[:250])
The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare

检查错误

>>> res = requests.get('http://inventwithpython.com/page_ _that_ _does_ _not_ _exist')
>>> res.raise_ _for_ _status()

将下载的文件保存到硬盘

>>> import requests
>>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
>>> res.raise_for_status()
>>> playFile = open('RomeoAndJuliet.txt', 'wb')
>>> for chunk in res.iter_content(100000):
		playFile.write(chunk)
100000
78981
>>> playFile.close()

HTML
HTML文件是一个纯文本文件,带有.html 文件扩展名。这种文件中的文本被“标签”环绕,
标签是尖括号包围的单词。标签告诉浏览器以怎样的格式显示该页面。一个开始标
签和一个结束标签可以包围某段文本,形成一个“元素”。“文本”是在开始标签和结束标签之间的内容。

<strong>Hello</strong> world!

打开浏览器的开发者工具
ctrl+12

用 BeautifulSoup 模块解析 HTML
从 HTML 创建一个 BeautifulSoup 对象

>>> import requests, bs4
>>> res = requests.get('http://nostarch.com')
>>> res.raise_for_status()
>>> noStarchSoup = bs4.BeautifulSoup(res.text)
>>> type(noStarchSoup)
<class 'bs4.BeautifulSoup'>

从硬盘加载一个 HTML 文件。

>>> exampleFile = open('example.html')
>>> exampleSoup = bs4.BeautifulSoup(exampleFile)
>>> type(exampleSoup)
<class 'bs4.BeautifulSoup'>

用 select()方法寻找元素
soup.select(‘div’)--------------------------所有名为

的元素
soup.select(’#author’)--------------------带有 id 属性为 author 的元素
soup.select(’.notice’)---------------------所有使用 CSS class 属性名为 notice 的元素
soup.select(‘div span’)-------------------所有在
元素之内的 元素
soup.select(‘div > span’)----------------所有直接在
元素之内的 元素,中间没有其他元素
soup.select(‘input[name]’)--------------所有名为,并有一个 name 属性,其值无所谓的元素
soup.select(‘input[type=“button”]’)----所有名为,并有一个 type 属性,其值为 button 的元素

>>> 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'}
>>> 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'}

通过元素的属性获取数据

>>> import bs4
>>> soup = bs4.BeautifulSoup(open('example.html'))
>>> spanElem = soup.select('span')[0]
>>> str(spanElem)
'<span id="author">Al Sweigart</span>'
>>> spanElem.get('id')
'author'
>>> spanElem.get('some_nonexistent_addr') == None
True
>>> spanElem.attrs
{'id': 'author'}

启动 selenium 控制的浏览器

#在实践中,使用Chrome能后台运行,firefox一调用就弹出来。
>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> type(browser)
<class 'selenium.webdriver.firefox.webdriver.WebDriver'>
>>> browser.get('http://inventwithpython.com')

在页面中寻找元素
find_element_*方法返回一个 WebElement 对象,代表页面中匹配查询的第一个元素。
find_elements_*方法返回 WebElement_*对象的列表,包含页面中所有匹配的元素。
selenium 的 WebDriver 方法,用于寻找元素:

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)---匹配 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)--------------完全匹配提供的 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)-----------匹配标签 name 的元素
browser.find_elements_by_tag_name(name)---------(大小写无关,<a>元素匹配'a''A')

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',表示该元素在页面上的位置
#我们发现了一个元素带有类名'bookcover',它的标签名是'img'。
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://inventwithpython.com')
try:
elem = browser.find_element_by_class_name('bookcover')
print('Found <%s> element with that class name!' % (elem.tag_name))
except:
print('Was not able to find an element with that name.')

点击页面

>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> browser.get('http://inventwithpython.com')
>>> linkElem = browser.find_element_by_link_text('Read It Online')
>>> type(linkElem)
<class 'selenium.webdriver.remote.webelement.WebElement'>
>>> linkElem.click() # follows the "Read It Online" link

填写并提交表单
(没有成功原因不清楚)

>>> from selenium import webdriver
>>> browser = webdriver.Firefox()
>>> 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()

发送特殊键
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 键和 Page Down 键

Keys.ESCAPE, Keys.BACK_SPACE,Keys.DELETE
Esc、Backspace 和字母键

Keys.F1, Keys.F2, . . . , Keys.F12
键盘顶部的 F 1 到 F 12 键

Keys.TAB
Tab 键

如果光标当前不在文本字段中,按下 home 和 end 键,将使浏览器滚动
到页面的顶部或底部。

>>> from selenium import webdriver
>>> from selenium.webdriver.common.keys import Keys
>>> browser = webdriver.Firefox()
>>> browser.get('http://nostarch.com')
>>> htmlElem = browser.find_ _element_ _by_ _tag_ _name('html')
>>> htmlElem.send_ _keys(Keys.END) # scrolls to bottom
>>> htmlElem.send_ _keys(Keys.HOME) # scrolls to top

点击浏览器按钮
利用以下的方法,selenium 也可以模拟点击各种浏览器按钮:
browser.back()点击“返回”按钮。
browser.forward()点击“前进”按钮。
browser.refresh()点击“刷新”按钮。
browser.quit()点击“关闭窗口”按钮

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值