【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 ...
随机推荐
- Java中的接口与抽象类的区别
由于随着jdk版本的更新,在jdk1.8时,接口也增强了,所以我们分别来说明一下. (1)jdk1.8之前 在jdk1.8之前,接口里面只能定义抽象方法和常量:而抽象类比普通类有一点不同,就是抽象类里 ...
- Matlab 数组
数组创建 1:逐个元素输入法:如:x=[1 2 3 4 5](中间也可以用逗号隔开) 2:冒号法:如:x=1:1:5 %从1到5步长为1 3:linspace 法: ----创建线性等距的数组 lin ...
- IDEA连接码云
IDEA连接码云: 1.安装Gitee插件 2.下载git.exe https://git-scm.com/download/win 3.安装git 如果是Win10专业版,可能会出错,GitBash ...
- 记一次Ddos遭遇
万年不用的vps最近借朋友用了几天,今天突然跟我说连不上了 上服务器先暴力重启一波 还是不行,netstat一看 端口的连接状态是这个样子: 估计连接被打满了,遂换了个端口 重启之 问题解决
- HTML-webstorm添加快捷键
快速输入标签: 先输入标签p,按Tab键变成<p></p>,光标会在标签中间 输入内容后按end键 快速复制粘贴光标所在的一整行内容Ctrl+D 快速删除光标所在的行 Ctrl ...
- 如何在word中插入代码
本文使用的是word2007,在网上查阅资料,可以使用如下方法: 1. 插入一个1行1列的表格,然后将代码写在里面,完成之后选中表格: 2. 将样式改为"HTML代码". 其实只是 ...
- C语言中Linux环境下编译与链接
编写一个简单的 hello.c 文件,以此为例. 1.编译并链接一个完全包含于一个源文件的C程序. gcc hello.c gcc -Wall hello.c gcc -o hello hello.c ...
- 卡耐基梅隆大学(CMU)元学习和元强化学习课程 | Elements of Meta-Learning
Goals for the lecture: Introduction & overview of the key methods and developments. [Good starti ...
- Spring Boot + RabbitMQ 使用示例
基础知识 虚拟主机 (Virtual Host): 每个 virtual host 拥有自己的 exchanges, queues 等 (类似 MySQL 中的库) 交换器 (Exchange): 生 ...
- 在之前的EventHandler中的参数类型必须继承EventArgs,现在已经去掉这个约束了。
分别是vs2008和vs2012的对比,可以看到2012已经去掉了约束条件.