关于在搜索引擎进行信息收集的学习总结:

代码设计:

  1. 主体包含一个两层的循环(搜索关键词(搜索页面));
  2. 函数实现对每个搜索关键词的遍历,其中需要一个循环(把从每一页爬取到的信息,输出到自建文档中)

代码复盘:

  1. headers模拟浏览器访问
  2. 主体:建立搜索词列表,提前申明自动生成报告的存储位置和名字,确立采集的网页数量,利用函数实现关键词信息爬取
  3. 函数部分:两个参数(关键词,访问网页数)。首先,对当前页面链接进行信息整体抓取,用到函数request.get().text。其次,将信息的标题、来源、时间、网页链接从源代码中提取出,利用正则表达式定位并采集,用到.?和(.?)和 re.findall和规则re.S(可忽略空格和换行)。提取出的标题用函数.strip()取消字符串两端的空格和换行,用re.sub(‘需要替换的东西’,’’,原文)删除不重要的符号和内容。最后一步,将每页收集的信息输入纯文本报告,用到函数open(文件位置),文件名.write。

需要提前导入的包:

  1. request
  2. re
  3. 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)  # 不要爬太快,爬太快会被百度反爬

上一篇:VisionPro 各控件的C#中类库 (CogToolBlock类)像函数设计一样。


下一篇:比diff更好的对比工具vim(它会用颜色标注出不同之处)某些时候