【云云怪】第6个项目:爬百度资讯

24
五月
2021

(先声明:创建这个项目的时候,百度的robots协议只禁止了taobao,所以我的爬虫是合法的。不过现在百度的robots又改了,所以这篇就不附上完整代码了)

【项目预览】

【创作背景】

学了爬虫之后,先捣鼓了一个爬今日头条的程序,然后我老公说,今日头条这种新晋暴发户太low了,百度才是中国互联网界的资深贵族,去做个爬百度新闻的程序吧。

【过程分析】

1,爬哪个网页?直接打开百度,输入关键词搜索,会进入“网页”。网页里面的信息太繁杂,有百科,有新闻,有广告,有贴吧,有音乐。。。实在不利于一只新闻爬虫工作。于是,我选择直接爬取“资讯”页面。

2,新闻的时效性:搜索新闻通常希望是有时效性的,比如我只想看1天以内的新闻。百度是咨询列出了新闻发布的时间,因此用datetime能够算出时效。

3,新闻的质量:在今日头条的项目里,我还做了个“评论数”筛选器,筛掉哪些很少评论(在我看来就意味着滥竽充数)的新闻,以获取高质量的精选新闻。但百度资讯没有很好的展示评论数,因此这个功能暂时只能放弃。

4,筛掉重复新闻:爬过一次才知道,百度搜出来的重复新闻太多太多,各家新闻网站一大抄,有的甚至名字都懒得换。我只能设置了一个“名字池”,每条新闻的名字先进“名字池”对比一下,没有重复的再显示和储存。

【完工体验】

最深的感受是,原来今日头条也不是很low啊。跟百度比起来,今日头条的新闻少而精,且列出了评论数,让我很容易判断出哪些是热点。百度搜索大而全,然而过于庞杂的信息量,反而让人找不到真正想看的东西。

【不完整代码】(省略了爬取和解析语句)

from openpyxl import Workbook,load_workbook
from bs4 import BeautifulSoup
import requests,datetime,time

def daydiff(day1, day2):
    time_array1 = time.strptime(day1, "%Y-%m-%d")
    timestamp_day1 = int(time.mktime(time_array1))
    time_array2 = time.strptime(day2, "%Y-%m-%d")
    timestamp_day2 = int(time.mktime(time_array2))
    result = (timestamp_day2 - timestamp_day1) // 60 // 60 // 24
    if result<0:
        result=-result
    return result

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
url='https://www.baidu.com/s'

print('\n本程序可爬取百度资讯(不是网页),生成资讯标题和链接的记录文件。\n')

while True:
    key=input('\n输入搜索关键词(多个关键词用空格分开):')
    days=int(input('\n输入新闻时效天数(例:今天请填0):'))
    item=int(input('\n输入搜索新闻条数(支持10-1000条):'))

    filename=key+'-百度资讯.xlsx'
    wb=Workbook()
    ws=wb.active
    ws.append(['新闻标题','来源网站','发布时间','链接','摘要'])
    titlepoor=[]
    count=0
    count0=0

    for x in range(0,item,10):
        page=round(x/10)
        params={
            'rtt': 1,
            'bsst': 1,
            'cl': 2,
            'tn': 'news',
            'ie':'utf-8',
            'wd': key,
            'pn':x,
            }
        try:
            #爬取和解析语句(省略拉~)
            res=xxxxxx
            soup=xxxxxx

            for i in range(1,11):
                count0+=1
                contan=soup.find(id='content_left')
                idd=contan.find(id=i+x)
                titletag=idd.find('h3')
                href=titletag.find('a')['href']
                title=titletag.find('a').text
                source=idd.find(class_="news-source").find(class_="c-color-gray").text.strip()
                time0=idd.find(class_="news-source").find(class_="c-color-gray2").text.strip()
                zhaiyao=idd.find(class_="c-color-text").text.strip()               
                
                if '分钟' in time0 or '小时' in time0:
                    day=0
                elif '昨天' in time0:
                    day=1
                elif '前天' in time0:
                    day=2
                elif '天前' in time0:
                    day=int(time0[:-2])
                else:
                    try:
                        today=str(datetime.datetime.now())[:10]
                        kuaizhao=idd.find('div',class_="c-span-last")
                        kuaizhaol=kuaizhao.find('a')['href']
                        
                        #爬快照并获取发布时间(省略拉~)
                        res1=xxxxxxxx
                        res1.encoding=xxxxxx
                        html1=xxxxxx
                        soup1=xxxxxxx

                        span=soup1.find(id="bd_snap_txt").find_all('span')
                        timee=(span[1].text)[12:24]
                        timeee=timee[:4]+'-'+timee[5:7]+'-'+timee[8:10]

                        day=daydiff(today,timeee)
                    except:
                        day=101
                    
                if days>=day and title not in titlepoor:
                    titlepoor.append(title)
                    count+=1        
                    ws.append([title,source,time0,href,zhaiyao])

                    print('\n'+title)
                    print(time0)

        except:
            print('\n加载到第{}页,已经没有更多内容。'.format(page))
            break

    if count>0:
        save=input('\n搜索了{}条新闻,找到{}条符合条件的。是否保存到本地?按1保存,按其他键放弃:'.format(count0,count))
        if save=='1':
            print('\n保存完毕。')
            wb.save(filename)
    else:
        print('\n哦豁,一条符合条件的新闻都没有找到。请调整搜索条件,重新搜索。')
        
    print('\n'+'-'*70)
    again=input('\n继续搜索请按回车,退出程序请按0:')
    if again=='0':
        input('\n谢谢使用,再见。')
        break

 

TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员