百度新闻爬取

266 阅读3分钟

爬取公司多页新闻数据

###首先,定义一个函数获取单页的数据

def get_details(url):
res = requests.get(url, headers=headers).text
p_info = '<p class="c-author">(.*?)</p>'
p_href = '<h3 class="c-title">.*?<a href="(.*?)"'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
info = re.findall(p_info, res, re.S)
href = re.findall(p_href, res, re.S)
title = re.findall(p_title, res, re.S)

source = [] # 先创建两个空列表来储存等会分割后的来源和日期
date = []
for i in range(len(info)):
title[i] = title[i].strip()
title[i] = re.sub('<.*?>', '', title[i])
info[i] = re.sub('<.*?>', '', info[i])
source.append(info[i].split('&nbsp;&nbsp;')[0])
date.append(info[i].split('&nbsp;&nbsp;')[1])
source[i] = source[i].strip()
date[i] = date[i].strip()
print(str(i + 1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')')
print(href[i])

###其次,我们需要获取首页中关于第2-10页的链接,具体代码如下:

res = requests.get(url, headers=headers).text
soup = BeautifulSoup(res,'lxml')
pages=soup.find('p',{'id':'page'}).find_all('a')

对其中pages进行整理,把标签<a>中的href提取出来并进行整理

urls=[]
for each in pages:
each=str(each)
p_url='<a href="(.*?)">'
try:
url=re.search(p_url,each,re.S).group(1)
url=url.replace('&amp;','&')
url='https://www.baidu.com'+url
urls.append(url)
except:
pass

###然后把这个过程封装成一个函数,函数中增加了公司名称的信息,代码中也有详细的注释信息

def baidu(company):
url = 'https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=' + company # 把链接中rtt参数换成4即是按时间排序,默认为1按焦点排序,3.4.1小节也有讲到
get_details(url) ###首先爬取第一页的数据
###找到第2-10页的网址
res = requests.get(url, headers=headers).text
soup = BeautifulSoup(res,'lxml')
pages=soup.find('p',{'id':'page'}).find_all('a')

urls=[]
for each in pages:
each=str(each)
p_url='<a href="(.*?)">'
try:
url=re.search(p_url,each,re.S).group(1)
url=url.replace('&amp;','&')
url='https://www.baidu.com'+url
urls.append(url)
except:
pass

###按顺序爬取第2-10页数据
for url in urls:
get_details(url)

###最后就是爬取数据了,列表companies可以再加入其他公司

companies = ['华能信托', '阿里巴巴', '万科集团', '百度集团', '腾讯', '京东']
for i in companys: # 这个i只是个代号,可以换成其他内容
baidu(i) #这里调用上面定义的函数
i=i+'百度新闻爬取完毕'
print(i.center(40,'='))

完整代码如下:

import requests
import re
from bs4 import BeautifulSoup
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}

def get_details(url):
res = requests.get(url, headers=headers).text
p_info = '<p class="c-author">(.*?)</p>'
p_href = '<h3 class="c-title">.*?<a href="(.*?)"'
p_title = '<h3 class="c-title">.*?>(.*?)</a>'
info = re.findall(p_info, res, re.S)
href = re.findall(p_href, res, re.S)
title = re.findall(p_title, res, re.S)

source = [] # 先创建两个空列表来储存等会分割后的来源和日期
date = []
for i in range(len(info)):
title[i] = title[i].strip()
title[i] = re.sub('<.*?>', '', title[i])
info[i] = re.sub('<.*?>', '', info[i])
source.append(info[i].split('&nbsp;&nbsp;')[0])
date.append(info[i].split('&nbsp;&nbsp;')[1])
source[i] = source[i].strip()
date[i] = date[i].strip()
print(str(i + 1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')')
print(href[i])

def baidu(company):
url = 'https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=' + company # 把链接中rtt参数换成4即是按时间排序,默认为1按焦点排序,3.4.1小节也有讲到
get_details(url) ###首先爬取第一页的数据
###找到第2-10页的网址
res = requests.get(url, headers=headers).text
soup = BeautifulSoup(res,'lxml')
pages=soup.find('p',{'id':'page'}).find_all('a')

urls=[]
for each in pages:
each=str(each)
p_url='<a href="(.*?)">'
try:
url=re.search(p_url,each,re.S).group(1)
url=url.replace('&amp;','&')
url='https://www.baidu.com'+url
urls.append(url)
except:
pass

###按顺序爬取第2-10页数据
for url in urls:
get_details(url)

companies = ['华能信托', '阿里巴巴', '万科集团', '百度集团', '腾讯', '京东']
for i in companys: # 这个i只是个代号,可以换成其他内容
baidu(i) #这里调用上面定义的函数
i=i+'百度新闻爬取完毕'
print(i.center(40,'='))

本文使用 mdnice 排版