Python中有关网页操作的标准库有很多
这次使用三个流行的bs4库、requests_html库和lxml库的方法,在你需要在自己的程序中插入指定网页的指定容器的内容时,可以插入下面的内容,因为你需要的信息可能是一直在变动的。缺点是如果网站运营者改动了网页的分支结构,这段代码就会出错,但是一般来说,大公司的网站结构一般不会随意改变,毕竟改进一次web结构,意味着底层码农需要重新学一次搬砖技巧。
比如说我们爬取https://python123.io/index中专栏后面的这行小字,这很显然是个静态的文字,爬取它不容易出错。
1.BeautifulSoup().select()方法
在这之前,我们要通过强大的CSS选择器获取这个特定元素,以Chrome为例:
from bs4 import BeautifulSoup
import requests
url = 'https://python123.io/index'
response = requests.get(url)
response.encoding=response.apparent_encoding
#因为网站使用的不是通用的utf-8格式,而是gzip,所以要让它判断解码格式
html = BeautifulSoup(response.text,'lxml')
#获取到的网页信息需要进行解析,使用lxml解析器,其实默认的解析器就是lxml,但是这里会出现警告提示,方便你对其他平台移植
content=html.select('#links > div:nth-child(1) > div.main > div > div.landing.is-clipped > div:nth-child(2) > div:nth-child(1) > h4:nth-child(6) > span')
#将复制好的选择器信息放进select方法中,将获取到的内容作为tag形式放入一个列表中
print(content[0].get_text())
#打印这个列表中第一个内容,就是我们要获得的信息
输出结果为:向别人清楚讲述,是更有效率的学习方式!开设专栏,分享你的所学所得。
2.HTMLSession.get().html.find()方法
from requests_html import HTMLSession
session=HTMLSession()
url=session.get('https://python123.io/index')
content=url.html.find('#links > div:nth-child(1) > div.main > div > div.landing.is-clipped > '
'div:nth-child(2) > div:nth-child(1) > h4:nth-child(6) > span',first=True)
#将选择器信息作为find方法中第一个参数键入,加上first参数,值为Ture
print(content.text)
#输出requests_html的元素的文本属性,得到目标文本(content变量类型为requests_html.Element)
输出结果为:向别人清楚讲述,是更有效率的学习方式!开设专栏,分享你的所学所得。
3.etree.HTML().xpath()方法
注意看对应的这段网页源代码,它是在span标签中,并且这个标签的class类名叫is-text-small is-text-grey,我们就用这个方法来直接匹配这个标签就可以得到信息了。
这个方法前半部分和第一个方法一样,嘻嘻,所以内容就轻易获取到了。
from lxml import etree
import requests
url = 'https://python123.io/index'
response = requests.get(url)
response.encoding=response.apparent_encoding
label=etree.HTML(response.text)
#提取这个页面中所有的标签信息
content=label.xpath('//span[@class="is-text-small is-text-grey"]/text()')
#提取span标签中class名为"is-text-small is-text-grey"的内容信息,并且存入一个列表中
print(content[0])
#打印获得的文本信息
输出结果为:向别人清楚讲述,是更有效率的学习方式!开设专栏,分享你的所学所得。
总结
至此,两种方法都爬取到了指定的文本信息,但是这样的爬虫既不能保证网站结构不改变,又不能保证不会被作为恶意爬虫被反爬,也不能保证被作为频繁的机器操作被屏蔽IP。
所以,在后续的博客中,我们尝试加入更健壮的爬虫方法,并且在访问时加入浏览器标头,以及使用动态IP去访问网址。
但是,无论如何,你的爬虫必须都遵从三点:
- 程序必须具有类人一样操作,不能利用计算机强大的计算能力,恶意频繁访问网站,给网站造成巨大的压力。所以,在编写爬虫时对其访问速度加以限制,以免对网站服务器带来巨大的资源开销。
- 法律准则:
(1)2017年6月1日起施行的《中华人民共和国网络安全法》规定:任何个人和组织不得窃取或者以其他非法方式获取个人信息,不得非法出售或者非法向他人提供个人信息。
(2)爬取数据过程中不应侵犯他人的知识产权。 - 遵循Robots协议:
查看网站的robots文件:网站主域名+"/robots.txt"
比如要查看百度的robots协议,则在网址处输入"https://www.baidu.com/robots.txt"