百度新闻爬虫
自己根据这篇文章的启发写了一个爬虫:
https://blog.csdn.net/aidanmo/article/details/104114988
具体步骤如下:
获得爬虫请求头
import requests import re headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/77.0.3865.120 Safari/537.36'} url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=阿里巴巴' res = requests.get(url, headers=headers) web_text = res.text
发布的网站和发布时间
pattern = '<p class="c-author">(.*?)</p>' info = re.findall(pattern, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符 info
发布来源和时间数据清洗
source=[] date=[] for i in range(len(info)): info[i]=re.sub('<.*?>', '', info[i]) source.append(info[i].split(' ')[0]) date.append(info[i].split(' ')[1]) source[i]=source[i].strip() date[i]=date[i].strip() print(source[i],date[i])
结果
泡泡网 38分钟前 新浪 4小时前 新浪财经 5小时前 新浪 4小时前 澎湃新闻 1小时前 36氪 2020年02月02日 13:13 钛媒体 6小时前 电商报 4小时前 太平洋电脑网 1小时前 美股研究社 22分钟前
发布的新闻链接
pattern_href= '<h3 class="c-title">.*?<a href="(.*?)"' href = re.findall(pattern_href, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符
发布的新闻标题
pattern_title = '<h3 class="c-title">.*?>(.*?)</a>' title = re.findall(pattern_title, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符 for i in range(len(title)): title[i] = title[i].strip() title[i] = re.sub('<.*?>', '', title[i]) # print(title[i]) print(str(i+1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')')
汇总后的代码如下
import requests import re def baidu_news(company,page): num = (page - 1) * 10 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/77.0.3865.120 Safari/537.36'} url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word='+company+str(num) res = requests.get(url, headers=headers) web_text = res.text #发布的网站和发布时间 pattern = '<p class="c-author">(.*?)</p>' info = re.findall(pattern, web_text, re.S) source=[] date=[] #获取新闻链接 pattern_href= '<h3 class="c-title">.*?<a href="(.*?)"' # pattern_herf = '<h3 class="c-title">.*?<a href="(.*?)"' href = re.findall(pattern_href, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符 #获取新闻标题 pattern_title = '<h3 class="c-title">.*?>(.*?)</a>' title = re.findall(pattern_title, web_text, re.S) # re.S用于考虑换行符,因为.和*不包含换行符 for i in range(len(title)): title[i] = title[i].strip() title[i] = re.sub('<.*?>', '', title[i]) # 数据清洗 for i in range(len(info)): info[i]=re.sub('<.*?>', '', info[i]) source.append(info[i].split(' ')[0]) date.append(info[i].split(' ')[1]) source[i]=source[i].strip() date[i]=date[i].strip() print(str(i+1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')') #数据的保存 file_news=open('百度新闻爬取1.txt','a',encoding='utf-8') file_news.write(company+str(num+1)+'页面新闻数据:' + '\n' + '\n') for i in range(len(title)): file_news.write(str(i+1)+'.'+title[i] +'(' + date[i] +')'+ '\n') # file_news.write(str(i+1) + '.' + title[i] + '(' + date[i] + ')' + '\n') file_news.write(href[i] + '\n') file_news.write('————————————————————————————————————————————'+'\n' + '\n') file_news.close() def main(): companys=['华能信托', '腾讯', '阿里巴巴'] for company in companys: for i in range(5): try: baidu_news(company,i+1) print(company+'第'+str(i+1)+'页新闻爬取成功') except: print(company+'第'+str(i+1)+'页新闻爬取失败') if __name__ == '__main__': main()
这是自己参考别人成功写的第一个爬虫。