网页源代码抓取工具(本文网络,仅供学习、交流使用不具有任何商业用途,)
优采云 发布时间: 2022-03-02 10:14网页源代码抓取工具(本文网络,仅供学习、交流使用不具有任何商业用途,)
前言
本文文字和图片来源于网络,仅供学习交流,不做任何商业用途。版权归原作者所有。如有任何问题,请及时联系我们进行处理。
1 提取百度新闻标题、URL、日期和来源1.1 获取网页源代码
我们可以通过以下代码获取网页的源代码。示例中的代码是获取百度新闻搜索阿里巴巴的网页源代码。
1import requests
2
3headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
4 'AppleWebKit/537.36 (KHTML, like Gecko) '
5 'Chrome/77.0.3865.120 Safari/537.36'}
6res = requests.get(url, headers=headers)
7web_text = res.text
8
因为百度新闻网站只识别浏览器发送的请求,所以需要设置headers参数来模拟浏览器的发送请求,chrome浏览器可以通过about:version获取。
1.2 编写正则表达式提取新闻信息1.2.1 提取新闻来源和日期
通过查看网页的源代码,我们发现每条新闻的来源和发布日期都夹在中间
和
因此,在这两者之间,可以通过正则表达式获得中间源和日期信息。
1pattern = '<p class="c-author">(.*?)'
2info = re.findall(pattern, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符
3print(info)
4
</p>
获取的信息收录许多字符,例如空格、换行符、制表符和
标签的内容需要清洗两次,后续章节会介绍。
1.2.2 提取新闻的 URL 和标题。
为了提取新闻 URL 和标题,我们需要像上一节一样从网页的源代码中找到规则。通过获取的源码,我们发现新闻地址都在前面。
通过以下两段代码,可以分别获取新闻的URL和标题。
1 pattern_herf = '.*?(.*?)'
6 title = re.findall(pattern_title, web_text, re.S)
7 print(title)
8
获取的数据还需要二次数据清洗。
1.2.3 数据清洗
新闻头条清洗
提取的新闻标题数据存在两个问题:一是每个标题的末尾收录换行符和一些空格;二是中间有和等无效字符。
(1)使用 stip() 函数删除不必要的空格和换行符。
1for i in range(len(title)):
2 title[i] = title[i].strip()
3
2)使用 sub() 函数处理和
1for i in range(len(title)):
2 title[i] = title[i].strip()
3 title[i] = re.sub('', '', title[i])
4
2 新闻来源和日期清理
提取的新闻来源和日期存在的问题:混杂了大量的标签信息;新闻来源和日期链接在一起;混合了许多换行符、制表符、空格等。
1for i inrange(len(info)):2info[i]= re.sub('','', info[i])#清洗
标签信息 3source.append(info[i].split(' ')[0])# 分离新闻来源和日期 4date.append(info[i].split(' ')[1])5source[i]= source [i].strip()6date[i]= date[i].strip()7
2. 批量获取多家公司的百度新闻并生成数据报表
本章主要实现批量获取多家公司信息,并自动生成数据报表,导出为文本文件
2.1 批量抓取多家公司的百度新闻
在这里,我们将爬取网页的工作封装成一个函数。
1defbaidu_news(company):2"""3 获取网页源代码,提取百度新闻标题、URL、日期和来源4 :param company: company name5 :return: 网页源代码6 """7 url ='# x27;+ company8#百度新闻网站只识别浏览器发送的请求,所以需要设置headers参数,9#模拟浏览器发送的请求,chrome浏览器可以获得10个headers ={ 'User-Agent through about:version ':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '11'AppleWebKit/537.36 (KHTML,如 Gecko)'12 'Chrome/77.0.3865.120 Safari/537.36'}13 res = requests.get(url, headers =headers)14 web_text = res.text1516#获取新闻17模式的来源和日期='
(.*?)
'18 info = re.findall(pattern, web_text, re.S)# re.S 用于说明换行符,因为 . and * 不收录换行符 19# print(info)2021# 获取新闻的url和标题 22 pattern_herf ='.*?23 herf = re.findall(pattern_herf, web_text, re.S)24# print(herf) 2526 pattern_title ='.*?>(.*?)'27 title = re.findall(pattern_title, web_text , re.S)28# print(title)2930# 标题数据清洗 31for i inrange(len(title)): 32title[i]= title[i].strip()33title[i]= re.sub('' ,'', title[i])3435# print(title)3637# 新闻来源和日期清洗 38 source =[ ]39 date =[]4041for i inrange(len(info)):42info[i]= re.sub('','', info[i])#清洗
标签信息 43source.append(info[i].split(' ')[0])# 分开消息源和日期 44date.append(info[i].split(' ')[1])45source[i]= source [i].strip()46date[i]= date[i].strip()4748print(str(i+1)+'.'+ title[i]+'('+ date[i]+ ' -'+来源[i]+')')49
然后在main函数中编写调用过程。
1 companys = ['华能信托', '腾讯', '阿里巴巴']
2 for company in companys:
3 baidu_news(company)
4 print(company + '百度新闻爬取成功')
5
结果如下所示:
11.信托业绩哪家强?两家去年净利超30亿 华宸华融有点“惨淡”(2020年01月21日 23:38-每日经济新闻)
22.57家信托业绩哪家强?中信、华能、重庆信托稳坐前三(2020年01月20日 07:47-新浪财经)
33.2019年净利润排位确定:中信信托35.93亿独占鳌头(2020年01月16日 16:51-金融界)
44.关于为“华能信托-链融科技诚意2期供应链金融资产支持专项计划”...(2020年01月16日 23:10-金融界)
55.2019信托公司业绩哪家强?(2020年01月17日 19:53-中国金融新闻网)
66.去年信托调研185家上市公司 电子设备制造业成为重点(2020年01月06日 10:07-中国基金会网)
77.关于为“华能信托-一方诚意3期供应链金融资产支持专项计划”提供...(2020年01月06日 23:10-新浪)
88.牧原股份联合华能信托 拟72亿元设立两家养猪子公司(2019年12月11日 22:28-同花顺财经)
99.牧原股份生猪养殖多地开花 借力华能信托找钱(2019年12月11日 10:32-财新)
1010.牧原股份(002714.SZ)与华能贵诚信托设立的合资公司已注册成立(2019年12月12日 21:09-新浪)
11华能信托百度新闻爬取成功
121.广东首例N95口罩诈骗案告破 腾讯协助*敏*感*词*破案(1小时前-中国新闻网)
132.抗击疫情 腾讯联合微医等五平台提供义诊服务(1小时前-新浪)
143.腾讯联合五大平台,在线义诊新型肺炎(1小时前-手机凤凰网)
154.腾讯文档开放免费会员,全面支持远程办公(4小时前-新浪)
165.最惨游戏工作室!13年9款神作却穷得叮当响,腾讯看中后出手了(1小时前-17173游戏网)
176.音乐战“疫”进行时 TME腾讯音乐人踊跃创作公益歌曲“声”援武汉(54分钟前-腾讯科技)
187.如果说国行NS不是腾讯和任天堂合作的重点,那什么是重点?(1小时前-新浪)
198.腾讯云向黄牛教授实验室,罗海彬教授团队提供免费云超算等(23分钟前-钛媒体)
209.停课不停学 腾讯课堂助力重庆十一中高三线下课首次线上开课(6小时前-环球网)
2110.腾讯文档开放免费会员功能 协同编辑人数至200人(50分钟前-中关村在线)
22腾讯百度新闻爬取成功
231.阿里巴巴全球14国直采医疗物资驰援,将通过东方航空陆续抵汉(39分钟前-武汉发布)
242.阿里巴巴全球采购医疗物资 首批N95口罩今日运抵武汉(29分钟前-浙江新闻)
253.阿里巴巴与东航合力 在14国采购与运输医疗物资(1小时前-新浪)
264.阿里巴巴全球采购医疗物资陆续抵沪(48分钟前-同花顺财经)
275.阿里巴巴一纸“禁令”后,商家祭出*敏*感*词*口罩!抓住这点、一招鉴别(9分钟前-IT爆料王)
286.阿里巴巴等百家企业承诺:防疫、民生用品价格不涨(6小时前-TechWeb)
297.【阿里巴巴等多个企业共同发出“三保行动 让我们一起出发”的倡议】(5小时前-新浪)
308.阿里巴巴上线发热门诊查询 已覆盖5734个发热门诊(2020年01月29日 11:10-中国新闻网)
319.武汉疫情口罩脱销,阿里巴巴发出紧急通知,这种口罩不能买!(1小时前-科技季节)
3210.阿里巴巴等多家企业响应市场监管总局“三保”行动(2020年01月29日 23:47-新浪财经)
33阿里巴巴百度新闻爬取成功
34
2.2 自动生成舆情数据报告文本文件
在上一节中,我们已经爬取了我们想要的新闻并生成了舆情结果,将导出到下面的文本文件中。
baidu_news()函数后添加导出到文件的相关操作代码如下:
1 file_ = open('数据挖掘报告.txt', 'a') #追加模式,不清除原来的数据
2 file_.write(company + '新闻数据:' + '\n' + '\n')
3 for i in range(len(title)):
4 file_.write(str(i+1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')' + '\n')
5 file_.write(href[i] + '\n')
6
7 file_.write('————————————————————————————————————————————' + '\n' + '\n')
8 file_.close()
9
3.异常处理与24小时实时数据挖掘实践3.1异常处理
这里,执行baidu_news()函数需要异常处理。
1 companys = ['华能信托', '腾讯', '阿里巴巴']
2 for company in companys:
3 try:
4 baidu_news(company)
5 print(company + '百度新闻爬取成功!')
6 except:
7 print(company + '百度新闻爬取失败!')
8
3.2 24小时实时爬取
这个函数的实现比较简单。您只需要在程序外部放置一个 while True 循环。然后,每次循环执行后,可以参考时间库,执行time.sleep()函数,让程序定时执行。.
通过前面的代码,我们已经可以实现24小时不间断的获取新闻内容,但是难免会抓取重复的新闻数据,这涉及到数据去重的内容,需要用到数据库的相关知识. 这部分内容将在后续章节中介绍,感兴趣的读者可以继续关注。
4. 按时间顺序爬取并批量爬取多页内容
前几章只爬取了百度新闻搜索结果首页的内容,新闻数据并不全面。本章将介绍批量爬取多页内容的方法。
4.1 按时间顺序爬取百度新闻
这里不涉及代码修改的内容,因为百度新闻默认按照“焦点顺序”排列新闻内容。这里我们可以选择搜索结果页面右上角的“按时间排序”按钮,然后修改url。
4.2 一次批量爬取多页内容
如果我们要爬取多页内容,我们需要分析每个页面的URL的差异。
第一个页面内容的 URL 是:
1https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=阿里巴巴
2
第二页内容的网址是
1https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=阿里巴巴&pn=10
2
第二页内容的 URL 是 .
1https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=阿里巴巴&pn=20
2
通过对比可以发现,页面URL的区别是&pn=XX。这里,可以确定可以在第一页的URL之后添加内容&pn=0。因此,代码可以修改如下。
1def baidu_news(company, page):
2 """
3 获取网页源码,并提取百度新闻标题、网址、日期和来源
4 :param company: 公司名称
5 :param page: 需要爬取的页面的数量
6 :return: 网页源码
7 """
8 num = (page - 1) * 10
9
10 url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=' + company + '&pn=' + str(num)
11
12 res = requests.get(url, headers=headers, timeout=10)
13 web_text = res.text
14 # 此处省略了数据提取、清洗和爬取的代码
15
16def main():
17 companys = ['华能信托', '腾讯', '阿里巴巴']
18 for company in companys:
19 for i in range(5): # 爬取5页内容
20 try:
21 baidu_news(company, i+1)
22 print(company + str(i+1) + '页新闻爬取成功!')
23 except:
24 print(company + str(i+1) + '页新闻爬取失败!')
25
5.搜狗新闻与新浪财经数据挖掘实践
这里采用的方法类似于爬取百度新闻的方法。
5.1 搜狗新闻数据爬取
首先,获取搜狗新闻的网址,我们在搜狗新闻中搜索“阿里巴巴”,得到网址(删除后):
阿里巴巴
完整代码如下:
1"""
2 作者:Aidan
3 时间:30/01/2020
4 功能:爬取搜狗新闻数据
5"""
6
7import requests
8import re
9
10# 百度新闻网站只认可浏览器发送的请求,所以需要设置headers参数,
11# 以模拟浏览器的发送请求,chrome浏览器可以通过about:version获取
12headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
13 'AppleWebKit/537.36 (KHTML, like Gecko) '
14 'Chrome/77.0.3865.120 Safari/537.36'}
15
16def sougou_news(company, page):
17 """
18 获取网页源码,并提取搜狗新闻标题、网址、日期和来源
19 :param company: 公司名称
20 :param page: 需要爬取的页面的数量
21 :return: 网页源码
22 """
23
24 url = 'https://news.sogou.com/news?query=' + company + '&page=' + str(page)
25
26 res = requests.get(url, headers=headers, timeout=10) # 当访问网址10秒没有响应时,就会停止访问。timeout=10
27 web_text = res.text
28
29 # 获取新闻日期
30 pattern_date = '<p class="news-from">.*? (.*?)'
31 date = re.findall(pattern_date, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符
32 # print(info)
33
34 # 获取新闻的网址和标题
35 pattern_herf = '.*?(.*?)'
40 title = re.findall(pattern_title, web_text, re.S)
41 # print(title)
42
43 # 数据清洗
44 for i in range(len(title)):
45 title[i] = re.sub('', '', title[i])
46 title[i] = re.sub('&.*?;', '', title[i])
47 date[i] = re.sub('', '', date[i])
48
49 file_ = open('搜狗数据挖掘报告.txt', 'a') #追加模式,不清除原来的数据
50 file_.write(company + str(i+1) + '页新闻数据:' + '\n' + '\n')
51 for i in range(len(title)):
52 file_.write(str(i+1) + '.' + title[i] + '(' + date[i] + ')' + '\n')
53 file_.write(href[i] + '\n')
54
55 file_.write('————————————————————————————————————————————' + '\n' + '\n')
56 file_.close()
57
58def main():
59 companys = ['华能信托', '腾讯', '阿里巴巴']
60 for company in companys:
61 for i in range(5): # 爬取5页内容
62 try:
63 sougou_news(company, i+1)
64 print(company + str(i+1) + '页新闻爬取成功!')
65 except:
66 print(company + str(i+1) + '页新闻爬取失败!')
67
68if __name__ == '__main__':
69 main()
70
</p>
欢迎点击左上角关注小编,除了分享技术文章还有很多福利,私信学习资料可领取,包括但不限于Python实战演练、PDF电子文档、面试亮点、学习资料等