python span 抓取_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('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')

所有

的元素

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


版权声明:本文为weixin_35450313原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。