自动抓取网页数据(自动抓取网页信息,也就是爬虫 )
优采云 发布时间: 2021-11-23 18:06自动抓取网页数据(自动抓取网页信息,也就是爬虫
)
自动抓取网页信息,即爬虫,一般通过js或者python可以更方便的实现。全部通过
模拟发送页面请求,然后解析html页面元素提取信息。
以js的实现为例:
function wraperAxiosHour(cityCode) {
return new Promise((resolve, reject) => {
const url = `http://www.weather.com.cn/weather1dn/${cityCode}.shtml`;
axios
.get(url)
.then(function(response) {
const $ = cheerio.load(response.data, {
decodeEntities: false
});
let hasBody = $("body").html();
if (hasBody == "") {
let errorInfo = {
msg: "城市代码错误",
code: 500
};
reject(errorInfo);
return;
}
let todayData = $(".todayRight script")
.html()
.replace("var hour3data=", "")
.replace(/\n/g, "")
.split(";");
todayData.pop();
//24小时
// console.log(jsonToObj(todayData[0]))
let forecastList1 = getPerTimeList(jsonToObj(todayData[0])[0])
.drgeeData;
let forecastList2 = getPerTimeList(jsonToObj(todayData[0])[1])
.drgeeData;
let forecastListob = forecastList1.concat(forecastList2);
let forecastList = forecastListob.slice(0, 24);
let lifeAssistant = getLv(0, $);
let sunup = jsonToObj(todayData[7].replace("var sunup =", ""))[1];
let sunset = jsonToObj(todayData[8].replace("var sunset =", ""))[1];
let max_degree = jsonToObj(
todayData[3].replace("var eventDay =", "")
)[2];
let min_degree = jsonToObj(
todayData[4].replace("var eventNight =", "")
)[1];
// console.log(max_degree,min_degree,sunup,sunset)
resolve({
forecastList,
lifeAssistant,
max_degree,
min_degree,
sunup,
sunset
});
})
.catch(err => reject(err));
});
}
python的实践:
python3中的requests库和urllib包都可以用来发送请求。注意urllib已经升级到3了。
区别:(转)
1)构建参数:构建请求参数时,第一个需要使用urllib库的urlencode方法进行编码预处理,非常麻烦
2) 请求方式:发送get请求时,第一个使用urllib库的urlopen方法打开一个url地址,第二个直接使用requests库的get方法,对应转为http请求方式,更直接易懂
3)请求数据:第一种方法是按照url格式拼接一个url字符串,显然很麻烦。第二种方法是按顺序写入get请求的url和参数。
4) 处理响应:第一种方法使用 .info() 和 .read() 方法分别处理消息头、.getcode()、响应状态码和响应正文,第二种方法使用.headers , .Status_code, .text 方法,方法名对应函数本身,更便于理解、学习和使用
5) 连接方式:看返回数据的头信息的“连接”。使用urllib库时,"connection":"close"表示每次请求结束时关闭socket通道,使用requests库使用urllib3,多个请求复用一个socket,"connection":"keep-alive ",表示多个请求使用一个连接,消耗更少的资源
6)Encoding:requests库的Accept-Encoding比较完整
得到html后,一种是直接使用python的re的正则表达式模块。一种是使用BeautifulSoup来解析。
def getTemp(html):
text = "".join(html.split())
patten = re.compile('(.*?)')
table = re.findall(patten, text)
patten1 = re.compile('(.*?)')
uls = re.findall(patten1, table[0])
rows = []
for ul in uls:
patten2 = re.compile('(.*?)')
lis = re.findall(patten2, ul)
time = re.findall('>(.*?)</a>', lis[0])[0]
high = lis[1]
low = lis[2]
rows.append((time, high, low))
return rows
soup = BeautifulSoup(text, 'html5lib')
conMidtab = soup.find("div", class_="conMidtab")
tables = conMidtab.find_all('table')