python爬虫网址拼接Python数据分析之爬虫第二练:如何一次爬取多个页面?python的网络爬虫不看后悔,
日期:2023/03/27 21:33作者:王秀玲人气:
导读:在上一练中,简单给小伙伴们介绍了爬虫的基本用法,针对的对象只是一个页面的内容。但是本着“问题不怕钻得深,挖出越多越开心”的精神,我又琢磨了下如果...
背景
在上一练中,简单给小伙伴们介绍了爬虫的基本用法,针对的对象只是一个页面的内容。如果仅仅是出于了解爬虫,内容倒是够了。但是本着“问题不怕钻得深,挖出越多越开心”的精神,我又琢磨了下如果一个专题包含多个网页改咋整,这就涉及到了爬取多个关键词和页面的问题,于是就有了本文,以下enjoy~~~
应用场景
参照《Python金融大数据挖掘与分析全流程》中的例子,对使用百度资讯搜索某些公司的案例进行了实践。
打开百度,在资讯栏中搜索“北京科锐”(之所以是它,因为我持有这货3W股从10.28亏到5.08。。。竟然到现在还没有跳楼,为自己的心理素质点个赞),搜到的页面如下图。
百度资讯页面
上面是第一页的内容,一共10条信息。如果我们觉得只看这一页的信息太少了,想多看几页怎么办呢?下面进入分析环节。
网页分析
我们发现,前3页的网址分别为:
https:
//www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&ie=utf-8&word=北京科锐
https:
//www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&ie=utf-8&word=北京科锐&pn=10
https:
//www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&ie=utf-8&word=北京科锐&pn=20
对比之后发现差异仅仅是最后的“pn=”部分有所不同,那是不是第4页面的为“pn=30”呢?我们把网址输入浏览器地址栏查查看。
第4页
Binggo!确实是!由此我们可以推测后面第n个页面分别是“(n - 1) * 10”的数字。随机测试下,果然如此。那么问题来了,第1个页面符合这个规律么,来,动动小手,再测试下。
第1页
我的天呐!又双叒叕对了,哇哦~~nice~~
哈哈哈
那么,对于其它需要查询的词呢,是不是也是这个规律,来,再次伸出我们的小手,hey,dude,have a try!
协创数据第4页
是的,没错,就这样,兄dei!好,既然我们的分析结论得到了确认,那么开始撸代码喽,好鸡冻,嗷嗷嗷嗷~~~
代码实现
## =========================================
## Title: 2.3.3 批量爬取多家公司的多页信息
## Author: 职教之光
## Date: 2022-04-29
## ==========================================
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
os.chdir(
D:/3.DA/Finance Bigdata mining and analysis with Python)
# 变更工作目录
print(
项目工作目录为:\n%s% os.getcwd())
# 获取当前工作目录
print(
66 *
-)
# 分割线
import requests
import re
# UA代表访问网站的浏览器是哪种浏览器,可以通过在地址栏中输入“about:version”获取
# “\”是行连接符,
headers = {
User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebkit/537.36 (Khtml, like Gecko) \
Chrome/100.0.4896.127 Safari/537.36}
def baiduinfo(company, page):
num = (page -
1) *
10 # 参数规律是(页数-1)*10
url =
https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd= + company +
&pn= + str(num)
web = requests.get(url, headers=headers, timeout=
10).text
# 设置超时为10s,避免程序挂死
# print(url)
page_href =
<h3 class="news-title.*?<a href="(.*?)"
href = re.findall(page_href, web, re.S)
# re.S作用是在使用findall()查找时,可以自动考虑到换行的影响,使得.*?可以匹配换行
page_title =
<h3 class="news-title.*?aria-label="(.*?)"
title = re.findall(page_title, web, re.S)
page_date =
<span class="c-color.*?aria-label="发布于:(.*?)"
date = re.findall(page_date, web, re.S)
page_source =
<span class="c-color-gray" aria-label="新闻来源:(.*?)"
source = re.findall(page_source, web, re.S)
for i
in range(len(title)):
# range(len(title)),这里因为知道len(title) = 10,所以也可以写成for i in range(10)
title[i] = title[i].strip()
# strip()函数用来取消字符串两端的换行或者空格,不过这里好像不太需要了
title[i] = re.sub(
<.*?>, , title[i])
# 核心,用re.sub()函数来替换不重要的内容
print(str(i +
1) +
. + title[i] +
( + date[i] +
- + source[i] +
))
print(href[i])
# 如果出现乱码问题,则设置encoding参数为utf-8,写成infofile = open(XXX.txt, a,encoding=utf-8)
# a是准假模式,w是写模式,如果把a改成w的话,则每次生成txt的时候都会把原来的txt清空,只能保留一家公司信息。
# 注意:查看保存到本地的文件时,需要重新进入下保存目录,否则看到的不是最近的生成结果。
infofile = open(
上市公司资讯.txt,
a)
# infofile.write(company + 数据爬取任务完成! + \n + \n) # \n表示换行符
for i
in range(len(title)):
infofile.write(str(i +
1) +
. + title[i] +
( + date[i] +
- + source[i] +
) +
\n)
infofile.write(href[i] +
\n)
# \n表示换行
infofile.write(
—————————————————————————————— +
\n +
\n)
infofile.close()
companys = [
北京科锐,
新世界]
# 为了防止程序因为偶然的异常而终止运行,使用try/except异常处理语句
for company
in companys:
for i
in range(
5):
try:
baiduinfo(company, i+
1)
# i是从0开始的序号,所以要写成i+1表示第几页
print(company +
第 + str(i+
1) +
页爬取成功)
except:
print(company +
百度新闻爬取失败!)
一起来练习
亲爱的旁友萌,您学会了么?
秀出你自己的作品吧,不要用爬虫干坏事呦~~~
欢迎交流和唠嗑~~~