网页源代码抓取工具(本文网络,仅供学习、交流使用不具有任何商业用途,)

优采云 发布时间: 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 = &#x27;<p class="c-author">(.*?)&#x27;

2info = re.findall(pattern, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符

3print(info)

4

</p>

  获取的信息收录许多字符,例如空格、换行符、制表符和

  标签的内容需要清洗两次,后续章节会介绍。

  1.2.2 提取新闻的 URL 和标题。

  为了提取新闻 URL 和标题,我们需要像上一节一样从网页的源代码中找到规则。通过获取的源码,我们发现新闻地址都在前面。

  通过以下两段代码,可以分别获取新闻的URL和标题。

  1 pattern_herf = &#x27;.*?(.*?)&#x27;

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(&#x27;&#x27;, &#x27;&#x27;, 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 ='.*?&gt;(.*?)'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 = [&#x27;华能信托&#x27;, &#x27;腾讯&#x27;, &#x27;阿里巴巴&#x27;]

2 for company in companys:

3 baidu_news(company)

4 print(company + &#x27;百度新闻爬取成功&#x27;)

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(&#x27;数据挖掘报告.txt&#x27;, &#x27;a&#x27;) #追加模式,不清除原来的数据

2 file_.write(company + &#x27;新闻数据:&#x27; + &#x27;\n&#x27; + &#x27;\n&#x27;)

3 for i in range(len(title)):

4 file_.write(str(i+1) + &#x27;.&#x27; + title[i] + &#x27;(&#x27; + date[i] + &#x27;-&#x27; + source[i] + &#x27;)&#x27; + &#x27;\n&#x27;)

5 file_.write(href[i] + &#x27;\n&#x27;)

6

7 file_.write(&#x27;————————————————————————————————————————————&#x27; + &#x27;\n&#x27; + &#x27;\n&#x27;)

8 file_.close()

9

  3.异常处理与24小时实时数据挖掘实践3.1异常处理

  这里,执行baidu_news()函数需要异常处理。

  1 companys = [&#x27;华能信托&#x27;, &#x27;腾讯&#x27;, &#x27;阿里巴巴&#x27;]

2 for company in companys:

3 try:

4 baidu_news(company)

5 print(company + &#x27;百度新闻爬取成功!&#x27;)

6 except:

7 print(company + &#x27;百度新闻爬取失败!&#x27;)

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的区别是&amp;pn=XX。这里,可以确定可以在第一页的URL之后添加内容&amp;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 = &#x27;https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=&#x27; + company + &#x27;&pn=&#x27; + str(num)

11

12 res = requests.get(url, headers=headers, timeout=10)

13 web_text = res.text

14 # 此处省略了数据提取、清洗和爬取的代码

15

16def main():

17 companys = [&#x27;华能信托&#x27;, &#x27;腾讯&#x27;, &#x27;阿里巴巴&#x27;]

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) + &#x27;页新闻爬取成功!&#x27;)

23 except:

24 print(company + str(i+1) + &#x27;页新闻爬取失败!&#x27;)

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 = {&#x27;User-Agent&#x27;: &#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) &#x27;

13                         &#x27;AppleWebKit/537.36 (KHTML, like Gecko) &#x27;

14                         &#x27;Chrome/77.0.3865.120 Safari/537.36&#x27;}

15

16def sougou_news(company, page):

17    """

18    获取网页源码,并提取搜狗新闻标题、网址、日期和来源

19    :param company: 公司名称

20    :param page: 需要爬取的页面的数量

21    :return: 网页源码

22    """

23

24    url = &#x27;https://news.sogou.com/news?query=&#x27; + company + &#x27;&page=&#x27; + 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 = &#x27;<p class="news-from">.*? (.*?)&#x27;

31    date = re.findall(pattern_date, web_text, re.S)  # re.S用于考虑换行符,因为.和*不包含换行符

32    # print(info)

33

34    # 获取新闻的网址和标题

35    pattern_herf = &#x27;.*?(.*?)&#x27;

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(&#x27;&#x27;, &#x27;&#x27;, title[i])

46        title[i] = re.sub(&#x27;&.*?;&#x27;, &#x27;&#x27;, title[i])

47        date[i] = re.sub(&#x27;&#x27;, &#x27;&#x27;, date[i])

48

49    file_ = open(&#x27;搜狗数据挖掘报告.txt&#x27;, &#x27;a&#x27;)     #追加模式,不清除原来的数据

50    file_.write(company + str(i+1) + &#x27;页新闻数据:&#x27; + &#x27;\n&#x27; + &#x27;\n&#x27;)

51    for i in range(len(title)):

52        file_.write(str(i+1) + &#x27;.&#x27; + title[i] + &#x27;(&#x27; + date[i] + &#x27;)&#x27; + &#x27;\n&#x27;)

53        file_.write(href[i] + &#x27;\n&#x27;)

54

55    file_.write(&#x27;————————————————————————————————————————————&#x27; + &#x27;\n&#x27; + &#x27;\n&#x27;)

56    file_.close()

57

58def main():

59    companys = [&#x27;华能信托&#x27;, &#x27;腾讯&#x27;, &#x27;阿里巴巴&#x27;]

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) + &#x27;页新闻爬取成功!&#x27;)

65            except:

66                print(company + str(i+1) + &#x27;页新闻爬取失败!&#x27;)

67

68if __name__ == &#x27;__main__&#x27;:

69    main()

70

</p>

  欢迎点击左上角关注小编,除了分享技术文章还有很多福利,私信学习资料可领取,包括但不限于Python实战演练、PDF电子文档、面试亮点、学习资料等

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线