爬取公司多页新闻数据
###首先,定义一个函数获取单页的数据
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(' ')[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] + ')')
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('&','&')
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('&','&')
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(' ')[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] + ')')
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('&','&')
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 排版