1.基本思路

        此下载框架由五部分组成,即:URL管理器、网页下载器、网页解析器、调度器和保存器。

        其时序图如图所示。

        

python爬取网页内的指定内容 python爬取网页某一个a标签_python爬取网页内的指定内容

 

       给定一个要访问的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