目录
BeautifulSoup中find(),find_all(),select()函数
网络爬虫背景意义
大数据时代,信息量大,覆盖面广:
互联网新闻信息服务单位总计761家,共有3765个服务平台 我国网民规模已达8.29亿 网络新闻用户规模达6.75亿,网民使用比例为81.4% 网民参与新闻热点发现与传播的热情空前高涨在百万新闻工作者和几亿网民的关注下,互联网信息拥有非常高的鲜活度
如何有效地提取并利用这些信息成为一个巨大的挑战:互联网中的数据是海量的,如何自动高效地获取互联网中我们感趣的信息并为我 们所用是一个重要的问题,而网络爬虫技术就是为了解决这些问题而生的。
什么是网络爬虫
网络爬虫也被称为网络蜘蛛、网络机器人,是一个自动下载网页的计算机程序或自动化脚本。网 络爬虫就像一只蜘蛛一样在互联网上沿着URL的丝线爬行,下载每一个URL所指向的网页,分析页面 内容。
什么是网络爬虫
import requests from bs4
import BeautifulSoup global
comments comments = ''
# 获取网页
def get_html(url): response = requests.get( url) return response.content
# 获取评论def get_reviews(html): html_doc = str(html, 'utf-8') bf = BeautifulSoup(html_doc, 'html.parser') comment = bf.find_all(class_="short-content") i = 0 for short in comment: global comments comments = comments + str(i) + short.text i = i+1 return comments
url_reviews="https://movie.douban.com/subject/26266893/reviews" html = get_html(url_reviews) reviews_content = get_reviews(html) print(reviews_content)
网络爬虫能做什么
采集后进行存储和数据分析:
舆情监测与分析、淘宝京东上商品价格变动情况、微博最近有啥热门话题、女/男神最新动态
自动地采集互联网中的信息:
爬取新闻和图片、爬取视频、爬取证劵/天气数据、爬取历年考研真题
一句话,只要浏览器有的,你都可以抓可以爬。
如何实现网络爬虫
第一步:爬哪里
确定爬取网址,获取 整个页面数据。
[第二步 ]爬什么(interesting)
通过分析网页源代码结果, 确定你对什么感兴趣。
[第三步 ]怎么爬(Method)
非常强大的正则表达式,许多 开源库(Request,BeautifulSoup)。 确定爬虫方法。
网络爬虫方法
由“网页爬取、网站爬取、动态网页爬取、反爬策略”四大核心技术组成。
网页
Request,BeautifulSoup库
网站
Scrapy开源框架
动态
selenium+Firefox(36版)反爬
控制访问频率 伪装成浏览器 使用代理IP等
网页爬虫方法
Request库:网络请求 与网络相关的的操作
get方法:获取网页内容
post方法:请求获取表单数据
BeautifulSoup库:网页解析
find_all方法:网页标签中提 取子元素
select( )方法:网页标签中提 取子元素
使用Python编写网络爬虫
网页结构
在编写网络爬虫之前,首先要对网页结构有一定的了解。大多数网页使用HTML(超文本标记语言)进行编写,通过获取网页源代码,我们就可以看到这个页面的HTML信息。
下面以Chrome浏览器为例,介绍查看网页源代码的方法:
如图所示,打开一个网页,右键单击空白处,在右键菜单中有一个查看源代码选项,通过点击查看源代码,我们就可以看到这个页面的HTML代码。
网页结构
浏览器会在新打开的标签页中显示该网页的源代码,此时我们就会发现,比如我们想要获取这个页面所有帖子的题目,都可以在网页源代码中找到。而网络爬虫的主要工作原理,就是在网页源代码中把我们想要的内容抽取出来。
HTML语言中是通过不同的标签来编写网页的,不同的标签对应着网页中不同的元素,有些标签之间可以嵌套,有些标签通过class属性来指定自己的类别,有些标签通过id属性来唯一标示自己,常用的有:<div>标签,用来标定一块区域;<p>标签,用于显示一段文字;<h1><h2><h3>等标签,用于显示一个标题;<a>标签,用于放置一个链接。
了解了这些,就可以开始制作我们的网页爬虫了。下面的内容将通过百度贴吧爬虫的实例进行同步讲解。
requests 库
requests 库是一个简洁且简单的处理HTTP请求的第三方库。requests的最大优点是程序编写过程更接近正常URL 访问过程。
request 库支持非常丰富的链接访问功能,包括:
国际域名和URL 获取、
HTTP 长连接和连接缓存、
HTTP 会话和Cookie 保持、
浏览器使用风格的SSL 验证、
基本的摘要认证、
有效的键值对Cookie 记录、
自动解压缩、
自动内容解码、
文件分块上传、
HTTP(S)代理功能、
连接超时处理、
流数据下载等。
有关requests 库的更多介绍请访问:
http://docs.python‐requests.org
准备工作
安装方法:
1)在命令窗口中输入:pip3 install requests,然后等待安装完成提示。
requests 库中的网页请求函数
最通常的方法是通过r=request.get(url)构造一个向服务器请求资源的url对象。
get()方法:
1)首先来看一下 requests 下 get 方法的基本用法,下面代码输出了 get() 方法返回值的类型和状态码(状态码为 200 表示请求成功):
import requests
response = requests.get("http://www.baidu.com")
print(type(response))
print(response.status_code)
<class ‘requests.models.Response’>
200
利用返回值的 text 属性,可以得到请求的内容:
import requests
response = requests.get("http://www.baidu.com")
print(response.text)
import requests
print('访问baidu网站 获取Response对象')
r = requests.get("http://www.baidu.com")
print(r.status_code)
print(r.encoding)
print(r.apparent_encoding)
print('将对象编码转换成UTF-8编码并打印出来')
r.encoding = 'utf-8'
print(r.text)
—
get()方法:
2)requests 库也可以直接添加 headers,例如,在很多时候,直接利用 get 方法访问网址的时候,会被拒绝。很大一部分原因就是没有添加请求的头部信息。例如,在访问知乎的时候,如果没有浏览器的头部信息,则访问会被拒绝,报 400 Bad Request 错误。
import requests
# 加入浏览器信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
response = requests.get("https://www.zhihu.com/explore", headers=headers)
print(response.text)
lxml库、selenium库、re库
•Beautiful Soup和Lxml是两个非常流行的python模块,他们常被用来对抓取到的网页进行解析,以便进一步抓取的进行。
•selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
•re库:正则表达式(通项公式)是用来简洁表达一组字符串的表达式。字符串匹配。
HTML常用标签
爬虫之BeautifulSoup4数据提取
from bs4 import BeautifulSoup
# 构建beautifulsoup实例
soup = BeautifulSoup(html,'lxml')
# 第一个参数是要匹配的内容
# 第二个参数是beautifulsoup要采用的模块,即规则
BeautifulSoup中find(),find_all(),select()函数
find:返回找到的第一个标签,即find_all()[0]。
find_all: 以list的形式返回找到的所有标签。
find_all(name, attrs, recursive, text, limit, **kwargs)
from bs4 import BeautifulSoup
html = '''
<table>
<tr class='a1'>
<td>职位名称</td>
<td>职位类别</td>
<td>时间</td>
</tr>
<tr class='a1'>
<td><a id='test' class='test' target='_blank' href='https://www.baidu.com/'>职位一</a></td>
<td>类别一</td>
<td>时间1</td>
</tr>
<tr class='a2'>
<td><a id='test' class='test' target='_blank' href='https://www.baidu.com/'>职位二</a></td>
<td>类别二</td>
<td>时间2</td>
</tr class='a3'>
<tr>
<td><a id='test' class='test' target='_blank' href='https://www.baidu.com/'>职位3</a></td>
<td>类别3</td>
<td>时间3</td>
</tr>
</table>
<div>
这是一个div
<p>
<!-- 这是一个注释 -->
</p>
</div>
'''
soup = BeautifulSoup(html,'lxml') # 解析html
# 1、获取所有的tr标签
trs = soup.find_all('tr') # 返回列表
# 2、获取class='a1'的tr标签
a.方法一: class_
trs = soup.find_all('tr',class_='a1')
b.方法二:attrs 将标签属性放到一个字典中
trs = soup.find_all('tr',attrs={'class':'a1'})
# 3、提取所有id='test'且class='test'的a标签
a.方法一: class_
alist = soup.find_all('a',id='test',class_='test')
b.方法二:attrs 将标签属性放到一个字典中
alist = soup.find_all('a',attrs={'id':'test','class':'test'})
# 4、get_text 获取所有职位信息
text = trs.get_text() # 返回字符串格式
b.方法二:attrs 将标签属性放到一个字典中
trs = soup.find_all('tr',attrs={'class':'a1'})
# select:获取所有tr标签
trs = soup.select('tr')
# select:获取第二个tr标签
trs = soup.select('tr')[1]
select:获取所有class="al"的tr标签
# 方法一:
trs = soup.select('tr.a1') # tr标签的class属性
# 方法二:
trs = soup.select('tr[class="a1"]') # tr标签的class属性
import requests
from bs4 import BeautifulSoup
url = 'https://news.sina.com.cn/w/2020-05-18/doc-iircuyvi3669422.shtml'
urlhtml=requests.get(url)
urlhtml.encoding='utf-8'
soup=BeautifulSoup(urlhtml.text,'lxml')
# text=soup.find_all('div',id='article',class_='article')
text=soup.select('#article > p:nth-of-type(5)')
print(text[0].get_text())
总结
通过学习,我们首先了解了网络爬虫的功能,通过对网页源代码的分析,我们了解了网络爬虫的工作原理,根据实际例子,我们了解了网络爬虫的编写方法和一些基础操作,如翻页、获取内容等。
网络爬虫的编写是十分灵活的,根据不同的页面结构和内容,可以灵活添加自己想要的功能,网络爬虫的编写也是十分简单的,可以看到短短不到20行的代码,就可以获取大量的信息,这也得益于Python语言的简单与强大。
网络爬虫的效率很高,可以在短时间内获取庞大的互联网信息,这为大数据分析工作提供了有效的数据获取手段。