简单介绍下网络爬虫及其常见架构

178 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

背景

大数据时代要进行数据分析就需要有数据,数据不仅来源于企业业务的数据库、系统的日志采集、网页上用户的浏览记录数据,还有一块很重要的数据就是来自互联网不仅仅是竞争对手的数据,还有一些公开的社交媒体数据。自从有网络从来以来就有数据存在,而爬虫就跟随互联网的存在而存在,主流的搜索引擎比较常见的Google,百度等搜索网站都是靠网络爬虫去采集的。网络数据采集是一种通过多种手段收集网络数据的方式,涉及非常广的编程技术和手段,如:数据分析、信息安全,数据库,HTTP协议,HTML语言,图像处理等。抓取可以运用于市场预测、机器语言翻译、医疗诊断等领域,通过爬虫的使用可以让你的工作更加高效,帮助你提升生产力,甚至开创一个全新的领域。

浏览器访问到底是怎么回事?

通常我们访问的数据都是通过浏览器进行显示,这就涉及到网络连接的问题,打个比方网络连接的过程,

比如张三有一台笔记本准备访问谷歌:

  • 张三在浏览器请求谷歌,实际上电脑底层是发送 1和0的比特值,这些网络请求一般包括请求头和消息体,请求头包含当前的本地路由器MAC地址和谷歌的IP地址,消息体包含张三对谷歌服务器的请求

  • 张三本地路由器收到所有1和0比特值,把他们理解成一个数据包,从张三自己的mac地址寄送到谷歌的IP地址,路由器把数据包盖上自己的IP地址作为发件地址,然后通过互联网发出去。

  • 张三的数据包游历了一些中介服务器,最终到达谷歌服务器

  • 谷歌服务器在他的ip地址收到数据包,获取一些请求信息,传递到相应处理程序,谷歌服务器生成对应HTML文件,返回给张三,然后通过本地路由器以同样的方式回传到张三记机器。事实上在整个过程中,浏览器都没有参与,浏览器起到一个获取HTML文件,解析成漂亮的图片、声音、视频和文件。

python访问网站的例子

访问网页不仅仅只有浏览器这种模式,事实上网络浏览器也是用程序编写的,可以用其他方式获取数据,比如说采用编程语言去访问网页,Python实现数据的方式如下:  

from urllib.request import urlopen

html=urlopen("http://www.baidu.com")

print(html.read());

实际上并不是每个网站并不会这么简单就让你获取到数据,不少网站会有防爬措施,也会验证访问来源,下面稍微深度点,基于python语言,讲解下内容的解析相关的知识。

Python访问进阶

一些Python库

  • urllib是Python的标准库,包含了从网络请求数据,处理cookie,甚至改变像请求头和用户代理这些元数据的函数。 urlopen是用来打开并读取一个从网络获取远程对象。
  • BeautifulSoup库 它通过定位HTML标签来格式化和组织复杂的网络信息,用简单易用的Python对象为我们展现XML结构信息。
    a.安装:
    Linux系统,sudo apt-get install python-bs4
    mac,可先装sudo easy_install pip,然后运行pip install Beautifulsoup4
    测试安装是否成功:命令行,先输入,python ,然后from bs4 import BeautifulSoup 没有错误,就说明成功了。

b.运行BeautifulSoup,例如获取一个页面的h1

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen(“http://www.sina.com”)
print(html.h1)

c.Beautiful 常用函数
get_text(),把HTML文档中所有标签都清除,然后返回一个只包含文字的字符串。
find()和findAll() 可以用这两个函数,通过标签的不同属性轻松的过滤HTML页面,查找需要的标签组或单个标签。

findAll(tag,attributes.recursive,text,limit,keywords),find就相当于findAll limit等于1
tag参数可以传一个或多个标签组成的列表作标签参数,如,.find({h1,h2,h3..})
attributes属性参数,是一个Python字典封装一个标签的若干属性和对应的属性值。如.findAll(“span”,{“class”:{“green”,”red”}})
文本参数不同于其它,它是用标签的文本内容去匹配,而不是用标签的属性。.findAll(text=“the price”)

keyword 关键词参数,可以让你选择那些具有指定属性的标签,findAll(id=”text”)导航树:
findAll函数通过标签名称和属性来查找标签。如果需要通过标签在文档中的位置来查找标签,可以使用导航树,
bsObj.tag.subTab.anotherTag
主要是HTML是有有规律的HTML标签来表示,找到一个标签后可以根据他查找其父、子、兄弟标签。\

一个获取豆瓣电影中的评分大于9.0的例子

# -- coding: utf-8 --
import urllib
from urllib.request import urlopen
from urllib.request import Request
import time
from bs4 import BeautifulSoup
BaseUrl = "https://book.douban.com/tag/%E7%94%B5%E5%BD%B1?start=0&type=T"
j=1
# 设置始末页码
for i in range(0, 98):
url = "https://book.douban.com/tag/%E7%94%B5%E5%BD%B1?start="+str(i*20)+"type=T"
headers = ('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11')

opener = urllib.request.build_opener()
opener.addheaders = [headers]
page = opener.open(url).read()
#解决BeautifulSoup中文乱码问题

soup = BeautifulSoup(page, from_encoding="gb18030")
# print("requet page"+page)
item_lists = soup.find_all("li", {"class":"subject-item"})

for item in item_lists:
#选择想要的点击率
ration = item.find("span",{"class":"rating_nums"})
if float(ration.string)>9.0:

content = item.find("div",{"class":"info"})

title = content.find("h2").find("a")
line1 = (title.get_text().strip())

des =ration.parent.next_sibling
line2 =des.string.strip()
print(line2)

f = open('movie.md', 'a')
f.write("###"+" "+line1+"\t"+"<"+line2+">"+"\t"+ " "+ "star"+str(ration)+"\n")
f.close()
j+=1

爬虫架构

爬虫的应用很广泛,从搜索引擎到企业大数据分析都会运用到,开源社区也有相关成熟的方案,下面给一张常规的爬虫架构:

​​

主要是几个部分组成:一个是爬虫任务调度器、网页下载器、页面解析器、结果清晰处理和存储。每个部分承担不同的功能,比如说网页下载器比如说是否要采用代理抓取、是否要启动浏览器模拟正常请求、是否需要Https请求又或者是普通的http get 不同的网页需要不同的下载器去请求数据,除此之外还有需要采用布隆过滤器之类的对url地址去重、针对网页文本进行去重、以及之后数据清洗也存储,搜索引擎的话还需要做倒排索引等等。

总结

此篇文章简单科普下网络爬虫在企业当中的应用以及基于python如何去进行网络爬取,同时介绍下相对专业的爬虫架构大概是怎么回事了。