python 实时抓取网页数据并进行 筛查


爬取数据的两种方法 :
方法 1 : 使用 requests.get() 方法,然后再解码,接着 调用 BeautifulSoup API

首先看 headers 获取方法 :

点击进入任意一个网页页面,按F12进入开发者模式,点击Network再刷新网页。在Network下的Name中任意点击一个资源,在右侧的Headers版块中下拉到最后,可以看见Request Headers参数列表最后有一个user-agent,其内容就是我们要找的浏览器headers参数值。

python循环抓取网页 用python抓取网页数据_开发语言


然后通过查找 html 源码来 find 指定内容 。利用 find_all() 方法 和 tag.find() 方法

python循环抓取网页 用python抓取网页数据_html_02

方法2 : 调用 Request() 方法,并进行 urlopen() , decode 操作,最后用 BeautifulSoup() 方法,这样对 html 解析完毕, 接着用 .select() 方法查找 html 代码中的指定内容 。

python循环抓取网页 用python抓取网页数据_python循环抓取网页_03


其实两种方法对于 html 的解析都是固定操作,关键在于 查找 html 的指定内容该如何查找。

首先使用F12对当前页面进行解析,如图所示 :

python循环抓取网页 用python抓取网页数据_前端_04


接着点击左上角的元素检查按钮,即 :

python循环抓取网页 用python抓取网页数据_html_05


然后再点击想要 爬取的网页内容, 就可以找到 其所在 html 源码中的位置 :

比如我这里的位置是在 pre 里面

python循环抓取网页 用python抓取网页数据_开发语言_06


紧接着右击 pre 栏,选择复制 selector , 就可以看见所找内容对应的 html 地址 : 我这里的为

#main-panel > pre:nth-child(11)

这里的关键信息就是 > 之后的内容 和 : 之前的内容 。如果有 多个 > 的话,就把多个 > 的信息列出来即可,比如 :

#group-topics > div:nth-child(2) > table > tbody > tr:nth-child(5) > td.title > a

那么就需要提取
tr td.title a
作为关键信息即可。

找出关键信息后,在方法 2 中的 .select() 中填入关键信息即可,注意关键信息用 ’ ’ 包起来 。

下面请看源码 :

from bs4 import BeautifulSoup
import requests
from datetime import datetime
import time
##import schedule

## 获取 headers 
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'}

## 方法 1 爬取 html 网页内容
ip0_url = "http://xxxxxxxxx.cn"
ip1_url = "http://xxxxxxxxx.cn"
ip2_url = "http://xxxxxxxxx.cn"

r_ip0 = requests.get(ip0_url,headers = headers)
r_ip1 = requests.get(ip1_url,headers = headers)
r_ip2 = requests.get(ip2_url,headers = headers)

html_ip0 = r_ip0.content.decode('utf-8','ignore')
html_ip1 = r_ip1.content.decode('utf-8','ignore')
html_ip2 = r_ip2.content.decode('utf-8','ignore')

ip0_page = BeautifulSoup(html_ip0,'lxml')
ip1_page = BeautifulSoup(html_ip1,'lxml') 
ip2_page = BeautifulSoup(html_ip2,'lxml')

def job_1(sa_page,time_now):
    now_file = "./err_log/pre.txt"
    file2 = open(now_file,'w').close()
    for tag in sa_page.find_all('html'):
        sub_tag = tag.find('body')
        with open(now_file,'a') as ff: 
            ff.write(sub_tag.text)
        ff.close()


def job_2(ip_name,log_file):
    ip = ip_name.split("_lo")[0]
    line_list = []
    sa_pre_path = "./err_log/pre.txt"
    sa_path = "./err_log/{}.txt".format(log_file)
    file1 = open(sa_pre_path,'rb')
    for line in file1.readlines():
        data = line.decode()
        strlist = data.split("/\n")[0]
        if "STATUS" in strlist:
            status = strlist.split("STATUS:")[1].split(" ")[0]
            if(status == "FAIL"):
                line_list.append(strlist)
                
    # 对 ip0 进行一些特殊处理
    if (ip_name == "ip0_log"):            
        with open(sa_path,'w') as fw:
            fw.write("\n====================={}====================\n\n".format(ip_name))
            for ll in line_list:
                fw.write(ll)
				
				# 从另外一个 html 网址获取内容
                ll_0 = ll.split("STATUS")[0]
                ll_1 = re.sub(r" ","",ll_0)
                ll_r = re.sub(r'/','_',ll_1)   ## re.sub()   replace function
                # 获取到指定 url 
                log_url =  "http://xxxx.cn/xxx/XXXXXX_IP/view/03/view/xxx/xxx/xxx_{0}_regre/lastCompletedBuild/testReport/(root)/{1}/{2}/".format(ip,ll_r,ll_r)
                ### 方法 2 ,使用 Request API 来爬取页面 (个人感觉比 方法 1 好用)
                r_log = Request(log_url,headers = headers)
                res = urlopen(r_log)
                aa = res.read().decode('utf-8')
                log_page = BeautifulSoup(aa,'html.parser')
                ## 搜索 关键路径 
                comment = log_page.select('pre')
                ######  如果 搜索的 html 网站 没有结果,则 跳过
                if(len(comment) < 2):
                    continue
                else:
                    cc = str(comment[1])
                    key_value = cc.split('Waive List:')[1].split('Error Pattern found')[0]
                    if (len(key_value) < 100):
                        fw.write("{}\n\n".format(key_value)) 
                    else:
                        fw.write("ERR MSG : \n")
                        if ("Offending" in key_value):
                            fw.write("Offending {}\n".format(key_value.split("Offending")[1].split("Offending")[0]))        # line 1
                        elif ("UVM" in key_value):
                            fw.write("UVM{}\n\n".format(key_value.split("UVM")[1].split("UVM")[0]))        # line 1
### 在文件中追加写入其他 ip 的内容
    else:
        with open(sa_path,'a') as fw:
            fw.write("\n====================={}====================\n\n".format(ip_name))
            for ll in line_list:
                fw.write(ll)

                ll_0 = ll.split("STATUS")[0]
                ll_1 = re.sub(r" ","",ll_0)
                ll_r = re.sub(r'/','_',ll_1)   ## re.sub()   replace function
                log_url =  "http://xxxx.cn/xxx/XXXXXX_IP/view/03/view/xxx/xxx/xxx_{0}_regre/lastCompletedBuild/testReport/(root)/{1}/{2}/".format(ip,ll_r,ll_r)
                r_log = Request(log_url,headers = headers)
                res = urlopen(r_log)
                aa = res.read().decode('utf-8')
                log_page = BeautifulSoup(aa,'html.parser')
                comment = log_page.select('pre')
                ######  pass search html data == 0 case : 
                if(len(comment) < 2):
                    continue
                else:
                    cc = str(comment[1])
                    key_value = cc.split('Waive List:')[1].split('Error Pattern found')[0]
                    if (len(key_value) < 100):
                        fw.write("{}\n\n".format(key_value)) 
                    else:
                        fw.write("ERR MSG : \n")
                        if ("Offending" in key_value):
                            fw.write("Offending {}\n".format(key_value.split("Offending")[1].split("Offending")[0]))        # line 1
                        elif ("UVM" in key_value):
                            fw.write("UVM{}\n\n".format(key_value.split("UVM")[1].split("UVM")[0]))        # line 1


###### 定时的提取  html 网页中的内容  并写入 txt 中去  
while True:
    time_hm = time.strftime("%H:%M", time.localtime())  # 刷新
    time_now = datetime.now().strftime("%Y-%m-%d.%H:%M:%S.%f") 
    
    if time_hm == "05:01": # 设置要执行的时间
        job_1(ip0_page,"ip0_log",time_now)
        job_2("ip0_log",time_now)
        job_1(ip1_page,"ip1_log",time_now)
        job_2("ip1_log",time_now)
        job_1(ip2_page,"ip2_log",time_now)
        job_2("ip2_log",time_now)

        time.sleep(120) # 停止执行120秒,防止反复运行程序。
    elif time_hm == "09:01": 
        job_1(ip0_page,"ip0_log",time_now)
        job_2("ip0_log",time_now)
        job_1(ip1_page,"ip1_log",time_now)
        job_2("ip1_log",time_now)
        job_1(ip2_page,"ip2_log",time_now)
        job_2("ip2_log",time_now)

        time.sleep(120) 

    elif time_hm == "13:01": 
        job_1(ip0_page,"ip0_log",time_now)
        job_2("ip0_log",time_now)
        job_1(ip1_page,"ip1_log",time_now)
        job_2("ip1_log",time_now)
        job_1(ip2_page,"ip2_log",time_now)
        job_2("ip2_log",time_now)

        time.sleep(120) 
    elif time_hm == "17:04":
        job_1(ip0_page,"ip0_log",time_now)
        job_2("ip0_log",time_now)
        job_1(ip1_page,"ip1_log",time_now)
        job_2("ip1_log",time_now)
        job_1(ip2_page,"ip2_log",time_now)
        job_2("ip2_log",time_now)

        time.sleep(120) 
    elif time_hm == "21:01":
        job_1(ip0_page,"ip0_log",time_now)
        job_2("ip0_log",time_now)
        job_1(ip1_page,"ip1_log",time_now)
        job_2("ip1_log",time_now)
        job_1(ip2_page,"ip2_log",time_now)
        job_2("ip2_log",time_now)

        time.sleep(120)
    elif time_hm == "01:01":
        job_1(ip0_page,"ip0_log",time_now)
        job_2("ip0_log",time_now)
        job_1(ip1_page,"ip1_log",time_now)
        job_2("ip1_log",time_now)
        job_1(ip2_page,"ip2_log",time_now)
        job_2("ip2_log",time_now)

        time.sleep(120)


    elif time_hm == "11:38":
        job_1(ip0_page,"ip0_log",time_now)
        job_2("ip0_log",time_now)
        job_1(ip1_page,"ip1_log",time_now)
        job_2("ip1_log",time_now)
        job_1(ip2_page,"ip2_log",time_now)
        job_2("ip2_log",time_now)
 
        time.sleep(120)