代码设计:
- 主体包含一个两层的循环(搜索关键词(搜索页面));
- 函数实现对每个搜索关键词的遍历,其中需要一个循环(把从每一页爬取到的信息,输出到自建文档中)
代码复盘:
- headers模拟浏览器访问
- 主体:建立搜索词列表,提前申明自动生成报告的存储位置和名字,确立采集的网页数量,利用函数实现关键词信息爬取
- 函数部分:两个参数(关键词,访问网页数)。首先,对当前页面链接进行信息整体抓取,用到函数request.get().text。其次,将信息的标题、来源、时间、网页链接从源代码中提取出,利用正则表达式定位并采集,用到.?和(.?)和 re.findall和规则re.S(可忽略空格和换行)。提取出的标题用函数.strip()取消字符串两端的空格和换行,用re.sub(‘需要替换的东西’,’’,原文)删除不重要的符号和内容。最后一步,将每页收集的信息输入纯文本报告,用到函数open(文件位置),文件名.write。
需要提前导入的包:
- request
- re
- time
心得:
想学习这方面的知识初衷是提高在券商实习的工作效率,所在的板块是食品饮料,经常需要收集单品价格调整的信息,琐碎且非常消耗时间。自己最后练习时发现还需改善和学习的地方有很多。比如,目前的代现只能实现采集当前搜索界面的信息,但没有获取更有价值的新闻内容,从这里衍生出的一个方向是如何获取新闻内容里有价值的信息。举个例子,想知道某件产品往年的提价举措,但对应“提价”一词存在很多同义词如“增长”“提升”藏在新闻的表述里,我们可以在某个界面里搜索某个关键词,但是如何做到不遗漏同义词表述,目前自己的感受还是人工阅读理解能做出快速判断。在目前的基础可以做稍微的调整(加一个函数),对于每个提取出的链接,再进行一次访问和提取。
还有一个问题,因为最后自动生成的是纯文本格式,但如果需要访问对应标题的网页,变得不太方便。解决办法是有的,但不是最优,Mac双击文本会推出一个小窗口但反应速度较慢,还有一个办法就是在Python源码中加入print语句,打印出链接。之后会继续学习如何自动生成word(.docx)类似文档。
希望有大神能指教,欢迎小伙伴们一起讨论交流。
练习代码如下:
import requests
import re
import time
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
def baidu(keyword, page):
num = (page - 1) * 10 # 参数规律是(页数-1)*10
url = 'https://www.baidu.com/s?tn=news&rtt=4&bsst=1&cl=2&wd=' + keyword + '&pn=' + str(num)
res = requests.get(url, headers=headers).text
# 正则表达式提取内容
p_href = '<h3 class="news-title_1YtI1"><a href="(.*?)"'
href = re.findall(p_href, res, re.S)
p_title = '<h3 class="news-title_1YtI1">.*?>(.*?)</a>'
title = re.findall(p_title, res, re.S)
p_date = '<span class="c-color-gray2 c-font-normal">(.*?)</span>'
date = re.findall(p_date, res)
p_source = '<span class="c-color-gray c-font-normal c-gap-right">(.*?)</span>'
source = re.findall(p_source, res)
for i in range(len(title)):
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])
file1.write(str((page-1)*10+i + 1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')' + '\n') ##这一行只写入标题,日期和来源,最后记得换行
file1.write(href[i] + '\n') # '\n'表示换行 ,这一行写入新闻链接
file1.write('——————————————————————————————' + '\n' + '\n') ##换两行写入下一家公司
keywords = ['国窖1573出厂价']
for keyword in keywords:
file1 = open('/Users/nicole/Documents/国窖1573出厂价报告.txt', 'a',encoding='utf-8')
file1.write(keyword + '数据挖掘completed!' + '\n' + '\n')
for i in range(5): # 这里一共爬取了5页
baidu(keyword, i + 1) # i是从0开始的序号,所以要写成i+1表示第几页
print(keyword + '第' + str(i + 1) + '页爬取成功') # i是从0开始的序号,所以写i+1
# time.sleep(3) # 不要爬太快,爬太快会被百度反爬