【python爬虫】一个简单的爬取百家号文章的小爬虫
需求
用“老龄智能”在百度百家号中搜索文章,爬取文章内容和相关信息。
观察网页

红色框框的地方可以选择资讯来源,我这里选择的是百家号,因为百家号聚合了来自多个平台的新闻报道。首先看了一下robots.txt,基本上对爬虫没有什么限制。然后就去定位网页元素,我的思路是先把上图搜索页的每篇文章的链接爬取下来,然后放在list里循环访问获取内容,这里再提一下为什么选百家号,因为你获取不同文章的链接之后,百家号文章页面的网页结构都是一样的。

通过Chrome浏览器F12可以轻松定位到文章链接。但是还要考虑翻页的问题,一般没啥反爬的网站,都是通过url就可以实现翻页。
https://www.baidu.com/s?tn=news&rtt=4&bsst=1&cl=2&wd=%E8%80%81%E9%BE%84%E6%99%BA%E8%83%BD&medium=2&x_bfe_rqs=20001&x_bfe_tjscore=0.000000&tngroupname=organic_news&newVideo=12&rsv_dl=news_b_pn&pn=20
https://www.baidu.com/s?tn=news&rtt=4&bsst=1&cl=2&wd=%E8%80%81%E9%BE%84%E6%99%BA%E8%83%BD&medium=2&x_bfe_rqs=03E80&x_bfe_tjscore=0.000000&tngroupname=organic_news&newVideo=12&rsv_dl=news_b_pn&pn=10
以上分别是第三页和第二页的url,很明显,最后的“pn=”后面的数字决定了页码,第一页显然是pn=0。好了现在就可以开始写爬虫了。
写代码
先写获取文章链接的部分。爬虫首先需要确认好headers的内容,我这里就用了user-agent和host,我试了一下,百度的话host还是需要的。

还是Chrome浏览器F12一下,在network里面随便点个东西,找到requests headers就可以找到我们需要的信息,将里面的user-agent和host复制进自己的代码中。
import requests
from bs4 import BeautifulSoup
import sys
import time
from openpyxl import workbook
from openpyxl import load_workbook
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
'Host': 'www.baidu.com'
}
headers1 = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
'Host': 'baijiahao.baidu.com'
}
导入库之后,这里我定义了两个header,第一个是百度搜索页使用,第二个是爬百家号文章时要用的。
#获取百家号文章链接
def get_connect(link):
try:
r = requests.get(link, headers=headers, timeout=10)
if 200 != r.status_code:
return None
url_list = []
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_='result-op c-container xpath-log new-pmd')
for div in div_list:
mu = div['mu'].strip()
url_list.append(mu)
print(mu)
return get_content(url_list)
except Exception as e:
print('e.message:\t', e)
finally:
print(u'go ahead!\n\n')
这里是定义了获取百家号链接,也就是爬取百度搜索页的函数,直接用bs4解析网页就行了,没什么难的,用了try exception做一下报错机制。
#获取百家号内容
def get_content(url_list):
try:
for url in url_list:
clist=[] #空列表存储文章内容
r1 = requests.get(url,headers=headers1,timeout=10)
soup1 = BeautifulSoup(r1.text, "lxml")
s1 = soup1.select('.article-title > h2:nth-child(1)')
s2 = soup1.select('.date')
s3 = soup1.select('.author-name > a:nth-child(1)')
s4 = soup1.find_all('span',class_='bjh-p')
title = s1[0].get_text().strip()
date = s2[0].get_text().strip()
source = s3[0].get_text().strip()
for t4 in s4:
para = t4.get_text().strip() #获取文本后剔除两侧空格
content = para.replace('\n','') #剔除段落前后的换行符
clist.append(content)
content = ''.join('%s' %c for c in clist)
ws.append([title,date,source,content])
print([title,date])
wb.save('XXX.xlsx')
except Exception as e:
print("Error: ",e)
finally:
wb.save('XXX.xlsx') #保存已爬取的数据到excel
print(u'OK!\n\n')
爬虫定位网页元素一般有bs4普通的find方法,css选择器,xpath(用soup.select方法)等路径。firefox浏览器在F12中右键你想要获取的元素可以选择是要CSS选择器还是xpath。
#主函数
if __name__ == '__main__':
raw_url='https://www.baidu.com/s?tn=news&rtt=4&bsst=1&cl=2&wd=老龄智能&medium=2&x_bfe_rqs=20001&x_bfe_tjscore=0.000000&tngroupname=organic_news&newVideo=12&rsv_dl=news_b_pn&pn='
wb = workbook.Workbook() # 创建Excel对象
ws = wb.active # 获取当前正在操作的表对象
# 往表中写入标题行,以列表形式写入!
ws.append(['title','dt','source','content'])
#通过循环完成url翻页
for i in range(1000):
link=raw_url+str(i*10)
get_connect(link)
print('page',i+1)
#time.sleep(5)
wb.save('XXX.xlsx')
print('finished')
wb.close()
最后把主函数写好,用一个for循环实现翻页操作,range范围这里我拍脑袋给的1000,根据实际情况来吧还是得。
实际效果

完事儿!
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理
想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!
【python爬虫】一个简单的爬取百家号文章的小爬虫的更多相关文章
- 【nodejs 爬虫】使用 puppeteer 爬取链家房价信息
使用 puppeteer 爬取链家房价信息 目录 使用 puppeteer 爬取链家房价信息 页面结构 爬虫库 pupeteer 库 实现 打开待爬页面 遍历区级页面 方法一 方法二 遍历街道页面 遍 ...
- 使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)
前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ...
- 一个简单的爬取b站up下所有视频的所有评论信息的爬虫
心血来潮搞了一个简单的爬虫,主要是想知道某个人的b站账号,但是你知道,b站在搜索一个用户时,如果这个用户没有投过稿,是搜不到的,,,这时就只能想方法搞到对方的mid,,就是 space.bilibil ...
- python爬虫:利用BeautifulSoup爬取链家深圳二手房首页的详细信息
1.问题描述: 爬取链家深圳二手房的详细信息,并将爬取的数据存储到Excel表 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目标网址:https://sz.lianjia.com ...
- Python爬虫之简单的爬取百度贴吧数据
首先要使用的第类库有 urllib下的request 以及urllib下的parse 以及 time包 random包 之后我们定义一个名叫BaiduSpider类用来爬取信息 属性有 url: ...
- Python爬虫入门教程 42-100 爬取儿歌多多APP数据-手机APP爬虫部分
1. 儿歌多多APP简单分析 今天是手机APP数据爬取的第一篇案例博客,我找到了一个儿歌多多APP,没有加固,没有加壳,没有加密参数,对新手来说,比较友好,咱就拿它练练手,熟悉一下Fiddler和夜神 ...
- Python 基础语法+简单地爬取百度贴吧内容
Python笔记 1.Python3和Pycharm2018的安装 2.Python3基础语法 2.1.1.数据类型 2.1.1.1.数据类型:数字(整数和浮点数) 整数:int类型 浮点数:floa ...
- Java爬虫框架WebMagic入门——爬取列表类网站文章
初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下. WebMagic框架简介 WebMagic框架包含四个组件,PageProcessor.Sch ...
- 用Python实现的一个简单的爬取省市乡镇的行政区划信息的脚本
# coding=utf-8 # Creeper import os import bs4 import time import MySQLdb import urllib2 import datet ...
随机推荐
- 【mq读书笔记】消息拉取
疑问:PullRequest何时添加? PullMessageService提供延迟添加与立即添加2种方式 疑问:PullRequest是在什么时候创建的呢? 1.上上图中 PullRequest p ...
- 《STM32CubeMX配置STM32H743XI工程》第一讲《初始化UART,重定义printf函数,点亮一个LED灯》
1.打开STM32CubeMX软件->新建一个工程(软件自行到ST官网下载安装) 2.输入对应的芯片型号(本次基于野火STM32H743XI Pro 开发板)点击Start Project生成项 ...
- 在windows环境下 nginx + .net core 3.1 实现反向代理和负载均衡
一.创建.net core web 应用 1.首先打开vs2019创建好.net core web应用,简单的注入IConfiguration 便于打印端口号展示效果. 1 private reado ...
- Django----View.py
·首先先下载安装包· pip install djangorestframework==3.11.1 pip install django-filter==2.3.0 # 过滤器 pip instal ...
- 20191012_WMI中可以看到有打印机, 设备管理器中没有
开发过程中使用SELECT * FROM Win32_Printer 查看设备有一个备份打印机, 并且被设置为默认打印机了, 但是设备管理器中没有 解决方法: 使用系统自带的测试WMI (Windo ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- 第10.1节 Python的模块及模块导入
一. 什么是模块 Python中的模块即单个的Python代码文件,为什么称为模块呢?这是因为在Python中,每个独立的Python文件都可以作为被其他代码导入的模块使用,导入的模块有自己的名字空间 ...
- PyQt(Python+Qt)学习随笔:QAbstractItemView的iconSize属性
老猿Python博文目录 老猿Python博客地址 视图的iconSize属性用于控制显示icon的项上的icon图标大小,在视图可见情况下设置该属性会导致视图上的显示项重新调整布局. 可以使用ico ...
- 关于将Linux中默认的OpenJDK替换为JDK的方法
首先下载需要的jdk安装包,后缀建议.tar.gz,本文中以jdk-8u212-linux-x64.tar.gz为例,地址就在oracle官网. 将安装包下载到linux环境后,使用命令tar -xz ...
- PHP中双引号引起的命令执行漏洞(Kuwebs代码审计 )
在代码审计一书中提到Kuwebs的配置文件中可以利用PHP可变变量的特性执行代码 在PHP语言中,单引号和双引号都可以表示一个字符串,但是对于双引号来说,可能会对引号内的内容进行二次解释,这就可能会出 ...