项目实战 | Python爬虫概述与实践(一)

2022-04-11 18:45:26 浏览数 (1)

目录

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&amp;rf=LaDigue_1920x1080.jpg&amp;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

编辑:葡萄媛

0 人点赞