第12章:从web抓取信息(笔记)

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_UPHome键、End键、PageUp和PageDown键
Keys.ESCAPE, Keys.BACK_SPACE, Keys.DELETEEsc键、Backspace键和Delete键
Keys.F1, Keys.F2,......, Keys.F12F1到F12键
Keys.TABTab键
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()         单击“关闭窗口”按钮

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值