PYTHON爬取网页

      首先我们打开需要爬取的网页(以教育宝信息内容为例),可以看到我们搜索一个网页中的内容时,它的URL表示的文件夹内容是有所变化的,例如我们从类别中搜索教育类时,我们发现它的URL是https://bj.jiaoyubao.cn/yingyu/ 当跳到第二页的时候URL变为https://bj.jiaoyubao.cn/yingyu/p2.hmtl,因此这个URL的规律为https://bj.jiaoyubao.cn/yingyu/p+N(循环变量).html我们可以拼接URL

PYTHON爬取网页_第1张图片

     

# -*- coding: utf-8 -*-
#需要调用的requests 库和 BeautifulSoup库中的bs4工具
import requests
import numpy
import re
import time
from bs4 import BeautifulSoup
num=0#定义条数的初始值
#定义一个变量url,为需要爬取数据我网页网址
#培训网站基类URL
baseUrl='https://jn.jiaoyubao.cn/'
#详细机构的URL
begin='https://jn.jiaoyubao.cn/edu/'

fout = open('output.txt', 'w')  # 打开输出文件
 #c=str(i)
    
#获取这个网页的源代码,存放在req中,{}中为不同浏览器的不同User-Agent属性,针对不同浏览器可以自行百度
req = requests.get(begin,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
#生成一个Beautifulsoup对象,用以后边的查找工作
soup = BeautifulSoup(req.text,'lxml')
#找到所有p标签中的内容并存放在xml这样一个类似于数组队列的对象中
xml = soup.find_all('a',class_='')
#利用循环将xml[]中存放的每一条打印出来
#匹配数字的正则表达式
rstr = r"[\=\(\)\,\/\\\:\*\?\"\<\>\|\' ']"  # '= ( ) , / \ : * ? " < > |  '   还有空格
        # 替换为下划线
for i in range(len(xml)):#表示从0到xml的len()长度
    msg = xml[i]['href']
    if msg.count("/")<=2 and str(xml[i].string).find("少儿")>=0:
        print(xml[i].string)
        if not xml[i].string is None :
            #向文件中写入培训分类名称并换行
            fout.write(xml[i].string)
            fout.write("\n")
        tagUrl=baseUrl+""+msg.strip('/')
        #请求所有分类的名称
        req = requests.get(tagUrl,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
        #生成一个Beautifulsoup对象,用以后边的查找工作
        soup = BeautifulSoup(req.text,'lxml')
        #找到所有p标签中的内容并存放在xml这样一个类似于数组队列的对象中
        xml2 = soup.find_all('a',class_='office-rlist-name')
        #print(len(xml2))
        for j in range(len(xml2)):#表示从0到xml的len()长度
            msg2 = xml2[j].string
            if not msg2 is None:
                num += 1
                #向文件中写入机构名称
                fout.write("第"+str(num)+":"+msg2)
                fout.write("\n")
                print('https://jn.jiaoyubao.cn'+xml2[j]['href'])
                #判断URL是否符合要求
            if not xml2[j]['href'] is None and xml2[j]['href'].find("http")<0:
                if xml2[j]['href'].find("//")>=0:
                    phoneUrl='https:'+xml2[j]['href'];
                else:
                    #拼接详细信息页面的URL
                    phoneUrl='https://jn.jiaoyubao.cn'+xml2[j]['href'];
                try:
                    #每一秒执行一次,防止服务器封IP
                    time.sleep(1)
                    #请求电话号码
                    req = requests.get(phoneUrl,{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'})
                    soup = BeautifulSoup(req.text,'lxml')
                    #找到所有p标签中的内容并存放在xml这样一个类似于数组队列的对象中
                    xml3 = soup.find_all('p',class_='fontArial')
                    if(len(xml3)>=1):
                        ss=str(xml3[0])[62:90].strip('span')
                        print(ss)
                        if not ss is None:
                            #分割字符串取出电话号码
                            fout.write(str(xml3[0])[62:90].strip('span'))
                            fout.write("\n")
                    for k in range(len(xml3)):#表示从0到xml的len()长度
                        msg3 = xml3[k].string
                        if not msg3 is None :
                            fout.write(msg3)
                            #fout.write('\n')
                            print("电话"+msg3)
                #捕获连接失败的错误
                except ConnectionError:
                    print("--")
                finally:
                    print("--")

fout.close() 
            


这样就能使用PYTHON的urllib和BeautifulSoup进行简单的网页信息的爬取,首先通过URLLIB的request方法来模拟浏览器访问网页,再将网页内容提取为一个XML文件,提取为XML文件后,首先通过soup的find_all方法来匹配标签名和CLASS名,以及可以通过字典来匹配标签的特定的属性名,来提取特定的标签,提取出网页中所有的符合条件的标签后,通过正则表达式来提取网页XML文件中的有效内容。

你可能感兴趣的:(python,PYTHON网页)