目录
1 定义
2 分类
3 基本流程
4 总结
1 定义
爬虫,又称为网络蜘蛛、网络机器人等,简单来说,就是请求网站并提取数据的自动化程序,可以代替人工在互联网上收集数据。
2 分类
通用网络爬虫
搜索引擎离不开爬虫,比如百度搜索引擎的爬虫叫百度蜘蛛(Baiduspider)、Bing的Bingbot、360的360Spider、搜狗的SougouSpider。搜索引擎的爬虫每天在海量的网页中爬取优质的信息并进行收录,根据用户输入的关键字在收录的信息中找到相关网页,并按照一定的算法进行排序显示给用户。这种在全互联网上获取信息的爬虫称为 通用网络爬虫或全网爬虫。
聚焦网络爬虫
聚焦网络爬虫,也叫主题网络爬虫,是根据我们的需求有选择性的爬取相关内容,在《十分钟生成自己的疫情地图,小白都能立刻上手》文章中,小媛儿获取疫情统计数据所用的爬虫,就是这种类型。
3 基本流程
基本流程主要包括四步:
- 发起请求
- 获取内容
- 解析内容
- 保存数据
爬虫的基本流程前两步是在模仿浏览器对服务器进行Resquest,获取从服务器的Response信息。
我们先来看一下浏览器对服务器的http请求过程
我们看到的网页是浏览器多次对服务器发送请求解析的结果,整个交互过程可以在浏览器中 通过 右击-检查(或审查元素)-Network 查看。
比如我们在浏览器中输入www.bing.com,查看的结果如图。
需要注意的在Request头部中包含请求方式(GETPOSTPUTDELETE等),在Response报文头部中有一个 3位数字的“状态码”字段,其中200表示相应成功。
发起请求
通过HTTP库指定URL向目标站点发起请求,即发送一个Request,等待服务器响应。python中发起请求常用的库主要包括urllib,requests。
代码语言:javascript复制import requests
url='https://www.bing.com' #指定目标服务器url
response=requests.get(url) #请求方式为get
获取内容
如果服务器能正常响应,会得到一个Response,Response的内容就是所要获取的页面内容,类型可能有HTML、JSON字符串、二进制(图片、视频)等。
举个简单例子,我们想要爬取bing首页的信息
代码语言:javascript复制import requests
url='https://www.bing.com' #指定目标服务器url
response=requests.get(url) #请求方式为get
response.encoding='utf-8' #设置编码格式,避免中文乱码
print(response.status_code) #检测response状态码,200表示爬取成功
print(response.text) #输出相应内容
输出结果部分截图:
代码语言:javascript复制200
<!DOCTYPE html><html lang="zh"><script type="text/javascript" >//<![CDATA[
si_ST=new Date
//]]></script><head><link id="bgLink" rel="preload" href="/th?id=OHR.BWFlipper_ZH-CN1813139386_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp" as="image" /><link rel="preload" href="/sa/simg/hpc27.png" as="image" /><meta content="text/html; charset=utf-8" http-equiv="content-type"/><script type="text/javascript">//<![CDATA[
/*!DisableJavascriptProfiler*/
0;
状态码=200表示爬取成功,爬取的Response与必应Network选项卡的Respones内容是一致的。
内容解析
如何从爬取的信息中提取我们需要的内容,主要包括六种解析方法,在Python爬虫后续系列文章中,我们会通过具体实例详细介绍。
Tips:
为什么有时候爬取的内容和网页看到的内容不一致?
比如访问头条官网www.taotiao.com,我们在网页看到的内容是这样的
然而通过requests爬取的html中并不能找到 页面中的新闻标题。
答:这是由于很多的页面是浏览器动态加载的,浏览器通过Ajax发送请求,js拿到数据后在页面上解析。当我们打开头条首页时,并没有显示网页中全部的新闻内容,而是在向下滑动鼠标时不断加载的,对于这种页面,通过Request请求,在Resonse中可以拿到html,但是爬取的html中并不包括页面中全部信息。
可以使用Selenium WebDriver来解决,前面介绍的爬虫是已经绕过了浏览器,从程序向服务器发出请求。而Selenium本身是自动化测试的工具,可以驱动或操控浏览器,服务器的Response也是在浏览器端做一个渲染,可以很好的解决动态加载的问题。
代码语言:javascript复制#pip install selenium
from selenium import webdriver #引入模块
driver=webdriver.Chrome() #创建驱动Chrome()运行会打开Chrome浏览器
driver.get('https://www.toutiao.com')
print(driver.page_source) #信息从driver中拿出来
返回结果部分截图:
代码语言:javascript复制</div> <div class="news-inner"><p class="module-title">“美国杀手”的P2P陷阱:财经红人,套住自家的8亿元“韭菜”</p></div></a></li><li class="article-item"><a href="/group/6815369661148824072/" target="_blank" class="news-link"><div class="module-pic news-pic"><img src="//p1.pstatp.com/list/240x240/pgc-image/Rw5jvZPIiRMNsp" lazy="loaded"></div> <div class="news-inner"><p class="module-title">美国约翰斯·霍普金斯大学修正疫情数据:全球确诊病例总数为1918855例</p></div></a></li><li class="article-item"><a href="/group/6815343607461970443/" target="_blank" class="news-link"><div class="module-pic news-pic"><img src="//p1.pstatp.com/list/240x240/pgc-image/fa4cfb63abd14bc8a6b504b0251f43e3" lazy="loaded"></div> <div class="news-inner"><p class="module-title">
这时已经可以从爬取得html中找到新闻标题相关的文字了。
保存数据
4 总结
本文主要介绍python爬虫的定义、分类和基本流程,后续连载文章中我们将会用实践项目详细介绍具体细节,感兴趣记得关注“程序媛驿站”,记得关注每周更新的“python爬虫概述与实践”
作者:balabala
编辑:葡萄媛