爬虫定义:
狭义定义:模拟浏览器浏览网页,并保存关心的数据的程序。
广义定义:自动下载网络数据的程序。网络数据包括:网页数据/游戏数据/App数据等等
简单起见,这里仅讨论的是基于网页的爬虫。
通过浏览器上网的流程:
首先在浏览器输入网址(URL),回车后向浏览器发起Requests请求,服务器通过域名解析得到HTML等文件的内容并Response返回给浏览器,最终浏览器将这些文件渲染成我们看到的页面。如下图所示:
我们爬虫关心的重点是Requests与Response。
爬虫流程:
下载数据:
下载的其实是HTML/json等文件
工具:通过requests套件下载,用命令pip install requests安装
解析数据:
解析下载的数据,获取需要的信息
解析的对象是HTML等文件
工具:通过xpath或bs4.BeautifulSoup套件解析,BeautifulSoup用命令pip install BeautifulSoup4安装
保存数据:
保存在本地
保存到数据库
编写爬虫获得网页数据
准备工作:
- 安装python3
- 安装Jupyter:pip install jupyter
- 启动:jupyter notebook
- 弹出的浏览器中,找到New--->Python3
- 写入python语句,按shift + enter 运行。
- 安装python爬虫套件:
requests:pip install requests
Beautifulsoup4:pip install BeautifulSoup4
下载数据:
import requests
res = requests.get('https://news.sina.com.cn/china/')
res.encoding = 'utf-8'
print(res.text)
解析HTML数据:
通过BeautifulSoup4可以将HTML数据解析成树形结构的数据,之后通过select()方法取得相应标签的数据。
from bs4 import BeautifulSoup
html_sample='''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>这是页面标题</title>
</head>
<body>
<h2 id="title">这是标题</h2>
<p class='p1'>段落1</p>
<p class='p2'>段落2</p>
<a href="" class='link'>链接</a>
</body>
</html>
'''
soup = BeautifulSoup(html_sample,'html.parser')
print(soup)
取得h2标签内容:
#使用select取出h2标签的内容
soup = BeautifulSoup(html_sample, 'html.parser')
header = soup.select('h2')
print(header)
发现上图得到的是一个list,这个list只有1个元素。通过下图方式获得h2标签的内容:
#抓取h2标签的内容
header[0].text
除了可以通过标签名来抓取对应标签内容外,还可以通过id或者class的值来查找相应内容:
#通过id抓取标签内容
soup.select('#title')[0].text
#通过class抓取标签内容
soup.select('.p2')[0].text
#通过class抓取标签内容
soup.select('.link')[0].text
注意:select()方法,如果是id="xxx" 则select(’#xxx‘); 如果是class=“xxx”,则select(’.xxx‘),和css规则一致,不要漏掉井号“#”或句点“.”
小结:
以上是假定一个简单的html文件,通过BeautifulSoup4套件工具来解析出相应标签的内容。
爬虫实战:
爬取新闻网址的新闻中标题、新闻时间、新闻责任编辑……
新闻网站URL:
进入新浪新闻网站:https://news.sina.com.cn/china/
往下找到任意一条新闻:
得到该新闻的URL: https://news.sina.com.cn/o/2018-11-13/doc-ihmutuea9882421.shtml
注意:该链接会失效,找到任意一条可以浏览的新闻地址代替即可。
1. 下载数据
import requests
res = requests.get('https://news.sina.com.cn/o/2018-11-13/doc-ihmutuea9882421.shtml')
res.encoding = 'utf-8'
source = res.text
print(source)
2.解析数据
谷歌浏览器打开上一步URL,空白处右键--->检查
获取标题所在的class=“main-title”
> 抓取新闻标题
#取出标题,网页查询标题所在的类为 .main-title
from bs4 import BeautifulSoup
soup = BeautifulSoup(source, 'html.parser')
title = soup.select('.main-title')[0].text
print(title)
>抓取新闻时间
找到新闻时间所在的类class=“date”
#抓取新闻时间,class=“date”
soup.select('.date')[0].text
>抓取新闻责任编辑
找到新闻责任编辑所在的类class=“show_author”
#抓取新闻责任编辑,class=“show_author”
soup.select('.show_author')[0].text
#抓取新闻责任编辑,class=“show_author”,并只保留责任编辑的姓名
soup.select('.show_author')[0].text.lstrip('责任编辑:')
完成! enjoy it!