一、简单爬虫框架
简单爬虫框架由四个部分组成:URL管理器、网页下载器、网页解析器、调度器,还有应用这一部分,应用主要是NLP配合相关业务。
它的基本逻辑是这样的:给定一个要访问的URL,获取这个html及内容(也可以获取head和cookie等其它信息),获取html中的某一类链接,如a标签的href属性。从这些链接中继续访问相应的html页面,然后获取这些html的固定标签的内容,并把这些内容保存下来。
一些前提:;所有要爬取的页面,它们的标签格式都是相同的,可以写一个网页解析器去获取相应的内容;给定的URL(要访问的资源)所获得的html,它包含的标签链接是可以筛选的,筛选后的标签链接(新的URL)会被继续请求其html文档。调度器是一个循环体,循环处理这些URL、请求以及html、网页解析。
1.运行流程
调度器是一个主循环体,负责不断重复执行URL管理器、下载器、解析器。URL是管理新的URL的添加、旧的URL的去除,以及URL的去重和记录。下载器顾名思义,就是根据URL,发送http请求,获取utf-8编码的字节流的html文件数据。解析器负责将html还原成DOM对象,并提供一套类似js的DOM操作的方法,从html中获取节点、属性、文本、甚至是样式等内容。
2.URL管理器
URL管理器有两个功能,获取待添加的URL–判断它是否在已被读取的URL集合里–[No]判断它是否在待读取的URL集合里–[No]添加到待读取的URL集合里。否则就直接抛弃。
URL管理器一般放在内存、关系型数据库和缓存数据库里。python里可以使用set()集合去重。
3.网页下载器
向给定的URL发送请求,获取html。python的两个模块。内置urllib模块和第三方模块request。python3将urllib2封装成了urllib.request模块。
1 # 网页下载器代码示例
2 import urllib
3
4 url = "http://www.baidu.com"
5
6 print("第一种方法: 直接访问url")
7 response1 = urllib.request.urlopen(url)
8 print(response1.getcode()) # 状态码
9 print(len(response1.read())) # read读取utf-8编码的字节流数据
10
11 print("第二种方法: 设置请求头,访问Url")
12 request = urllib.request.Request(url) # 请求地址
13 request.add_header("user-agent", "mozilla/5.0") # 修改请求头
14 response2 = urllib.request.urlopen(request)
15 print(response2.getcode())
16 print(len(response2.read()))
17
18 import http.cookiejar # 不知道这是啥
19
20 print("第三种方法: 设置coockie,返回的cookie")
21 # 第三种方法的目的是为了获取浏览器的cookie内容
22 cj = http.cookiejar.CookieJar()
23 opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
24 urllib.request.install_opener(opener)
25 response3 = urllib.request.urlopen(url)
26 print(response3.getcode())
27 print(len(response3.read()))
28 print(cj) # 查看cookie的内容
4.网页解析器
将utf-8编码的字节码重新重新解析为html。因为数据传输是字节数据,所以网页下载器下载的内容需要重新解析。
提供DOM对象[html文档解构]的操作方法。和js类似。包括节点、标签元素、属性[包括name、class、style、value等等]、样式、内容等的操作。从而能够获取特定的内容。
python的BeautifulSoup模块(bs4)。以下代码可直接在bs4模块官方文档中获取和运行。
1 from bs4 import BeautifulSoup
2 from re import compile
3 html_doc = """
4 <html><head><title>The Dormouse's story</title></head>
5 <body>
6 <p class="title"><b>The Dormouse's story</b></p>
7
8 <p class="story">Once upon a time there were three little sisters; and their names were
9 <a href="http: