1.基本思路
此下载框架由五部分组成,即:URL管理器、网页下载器、网页解析器、调度器和保存器。
其时序图如图所示。
给定一个要访问的url,获取这个html及内容,遍历html中的某一类链接,如a标签的href属性,从这些链接中继续访问相应的html页面,然后获取这些html的固定标签的内容,如果需要多个标签内容,可以通过字符串拼接,最后通过正则表达式删除所有的标签,最后将其中的内容写入.txt文件。
所有要爬取的页面,它们的标签格式都是相同的,给定的url所获得的html,它包含的标签链接是可以筛选的,筛选后的标签链接会被继续请求其html文档。通过一个调度器是一个循环体,循环处理这些url、请求以及html、网页解析。
2.Beautiful Soup库
下载引擎中网页解析的部分使用Beautiful Soup,其为python的一个库,最主要的功能是从网页抓取数据,通过解析文档为用户提供需要抓取的数据。此外Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能,为用户灵活地提供不同的解析策略或强劲的速度。
此处我使用的BeautifulSoup(markup, “lxml”)方法承担html解释器的角色,返回一个BeautifulSoup对象,其最大优势是速度快且文档容错能力强。
一般来说,为了找到BeautifulSoup对象内所有标签,使用find_all()方法找到所有匹配结果出现的地方,其参数为find_all(name, attrs, recursive, text, limit, **kwargs),这里只需要传入参数标签名和属性即可,比如在代码中使用的soup.find_all('a')即为获取所有<a>标签内部的内容,然后通过get(‘href’)方法即返回得到url标签,这里即可承担URL管理器角色。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
3.代码
from bs4 import BeautifulSoup
import requests
import time
import re
count=1 #全局变量,统计下载文档的个数
def find(url): #爬取有效数据(下载器)
global count
f = requests.get(url) #请求目标网站
#创建一个BeautifulSoup对象,对html解析(解析器)
soup = BeautifulSoup(f.content, "lxml")
#过滤js和css
[script.extract() for script in soup.findAll('script')]
[style.extract() for style in soup.findAll('style')]
#网页标签正则表达式
dr = re.compile(r'<[^>]+>',re.S)
#保存新闻的标题
ti = str(soup.find('title'))+'\n'
all = dr.sub('',ti) #字符串保存需要写入文件的内容
for k in soup.find_all('div',class_='article'): #找到所有指定标签及其内容
all +=dr.sub('',str(k)) #过滤所有标签
#写入文件(保存器)
with open('./中文文档/ News_'+str(count)+'_Org.txt', 'w', encoding='utf-8') as f:
f.write(all)
count = count+1
if __name__ == "__main__": #程序入口
for i in range(1,16): #循环分页爬取(调度器)
url = "http://****"+str(i) #指定网址
f = requests.get(url) #请求url
soup = BeautifulSoup(f.content, "lxml") #获取整个网页内容
for item in soup.find_all('a'): #遍历所有链接(URL管理器)
url = str(item.get('href'))
if url.find("http") < 0 : #仅保留http链接
continue
else:
find(url)
time.sleep(0.5)
if(count>500):
Break