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的<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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容