德胜云资讯,添加一些关于程序相关的内容,仅供大家学习交流(https://www.wxclwl.com)

网站地图

搜索
德胜云咨询
后端分类 爬虫 网络安全 PHP SQL
热门标签:
最新标签:

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 + 百度新闻爬取失败!)

一起来练习

亲爱的旁友萌,您学会了么?

秀出你自己的作品吧,不要用爬虫干坏事呦~~~

欢迎交流和唠嗑~~~

排行

网站地图

Copyright © 2002-2022 香港德胜云网络 版权所有 | 备案号:蜀ICP备2023007363号-5

声明: 本站内容全部来自互联网,非盈利性网站仅供学习交流