Python学习笔记——从Web抓取信息

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的元素
browser.find_element_by_partial_link_text(text)
browser.find_elements_by_partial_link_text(text)
包含提供的text的元素
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')
1.2.3 WebElement的属性和方法:
属性或方法 描述
tag_name 标签名,例如'a'表示元素
get_attribute(name) 该元素name属性的值
text 该元素内的文本,例如hello中的'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('[email protected]')
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') 所有
的元素
soup.select('#author') 带有id属性为author的元素
soup.select('.notice') 所有使用CSSclass属性名为notice的元素
soup.select('divspan') 所有在
元素之内的元素
soup.select('div>span') 所有直接在
元素之内的元素,中间没有其他元素
soup.select('input[name]') 所有名为,并有一个name属性,其值无所谓的元素
soup.select('input[type="button"]') 所有名为,并有一个type属性,其值为button的元素

不同的选择器模式可以组合起来,形成复杂的匹配。例如,soup.select('p#author')将匹配所有id属性为author的元素,只要它也在一个

元素之内。

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]) 
'Al Sweigart' 
>>> elems[ 0].attrs
{'id': 'author'}
>>> spanElem = exampleSoup.select('span')[0]
>>> spanElem.get('id') 
'author' 
>>> spanElem.get('some_nonexistent_addr') == None 
True

你可能感兴趣的:(Python学习笔记——从Web抓取信息)