首先我们打开需要爬取的网页(以教育宝信息内容为例),可以看到我们搜索一个网页中的内容时,它的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
# -*- 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文件中的有效内容。