Python爬取简书主页信息
主要学习如何通过抓包工具分析简书的Ajax加载,有时间再写一个Multithread proxy spider提升效率。
1. 关键点:
使用单线程爬取,未登录,爬取简书主页Ajax加载的内容。主要有三个关键点:
- 抓包抓到的
X-INFINITESCROLL: true、X-Requested-With: XMLHttpRequest、两个字段是固定的。 - 还有
X-CSRF-Token这个key的value通过首次请求简书首页获得,用于爬取Ajax的下一页。 - 表单里的
seen_snote_ids[]: xxxxx是文章的ID,如果下次请求不带上这个ID,会出现重复的数据
2. 效果图:

3. 源代码:
# /usr/bin/env python3
# _*_ coding:utf-8 _*_
"""
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Name : Liu
Date : 2019/4/1 18:14
Version : Python 3.7.0
IDE : Pycharm-community-2018.2.4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
import requests
import re
import time
class JianshuSpider(object):
def __init__(self):
self.url = 'https://www.jianshu.com' # 主页URL
self.page = 5 # 爬取的页数
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
def get_home_content(self):
# 请求
home_code = requests.get(self.url,headers=self.headers)
home_data = home_code.text
# 获取请求头部所需的 token
token = re.findall('<meta name="csrf-token" content="(.*?)" />',home_data)[0]
# 获取第一页所有文章的ID
id = re.findall('data-note-id="(\d*)"',home_data,re.S)
# 使用正则处理请求,获取文章的标题、链接、简介
home_page_article = self.parsing_codes(home_data)
# 打印
self.echo_content(home_page_article)
# 传入所需的token、id、爬取页数后,开始加载Ajax(爬取下一页)
self.get_next_content(token,id,self.page)
def get_next_content(self,token,id,pages):
# 使用for循环
for page in range(2,pages+1):
# 准备请求头部
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
"X-INFINITESCROLL": "true",
"X-Requested-With": "XMLHttpRequest",
"X-CSRF-Token": token
}
# 需要提交的表单
params = {
"page": page, # 页数
"seen_snote_ids[]": id # 帖子的ID
}
url = 'https://www.jianshu.com' # 请求的URL
# 发送请求
resp = requests.get(url,headers=headers,params=params)
# 使用正则处理请求,获取文章的标题、链接、简介
article = self.parsing_codes(resp.text)
# 打印内容
self.echo_content(article)
# 打印方法...
def echo_content(self,article):
for i in article: # 你可以不用这个方法,而是将其改为写入到文件的...
title = i[1] # 标题,
link = i[0] # 链接
desc = i[2] # 描述
print('[标题]:%s' % title)
print('[链接]:%s' % self.url + link)
print('[简介]:%s' % desc.lstrip())
time.sleep(0.1)
# 正则处理方法...
def parsing_codes(self,data):
article = re.findall('<a class="wrap-img" href="(.*?)" target="_blank">.*?<a class="title" target="_blank" href=".*?">(.*?)</a>.*?<p class="abstract">(.*?)</p>',data, re.S)
return article
# ...?
if __name__ == '__main__':
jianshu = JianshuSpider()
jianshu.get_home_content()
Python爬取简书主页信息的更多相关文章
- python 爬取简书评论
import json import requests from lxml import etree from time import sleep url = "https://www.ji ...
- python3 爬取简书30日热门,同时存储到txt与mongodb中
初学python,记录学习过程. 新上榜,七日热门等同理. 此次主要为了学习python中对mongodb的操作,顺便巩固requests与BeautifulSoup. 点击,得到URL https: ...
- Node爬取简书首页文章
Node爬取简书首页文章 博主刚学node,打算写个爬虫练练手,这次的爬虫目标是简书的首页文章 流程分析 使用superagent发送http请求到服务端,获取HTML文本 用cheerio解析获得的 ...
- Scrapy+selenium爬取简书全站
Scrapy+selenium爬取简书全站 环境 Ubuntu 18.04 Python 3.8 Scrapy 2.1 爬取内容 文字标题 作者 作者头像 发布日期 内容 文章连接 文章ID 思路 分 ...
- python2.7 爬取简书30日热门专题文章之简单分析_20170207
昨天在简书上写了用Scrapy抓取简书30日热门文章,对scrapy是刚接触,跨页面抓取以及在pipelines里调用settings,连接mysql等还不是很熟悉,今天依旧以单独的py文件区去抓取数 ...
- 用Python爬取智联招聘信息做职业规划
上学期在实验室发表时写了一个爬取智联招牌信息的爬虫. 操作流程大致分为:信息爬取——数据结构化——存入数据库——所需技能等分词统计——数据可视化 1.数据爬取 job = "通信工程师&qu ...
- python爬取 “得到” App 电子书信息
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 静觅 崔庆才 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- Python爬取房天下二手房信息
一.相关知识 BeautifulSoup4使用 python将信息写入csv import csv with open("11.csv","w") as csv ...
- python爬取北京政府信件信息01
python爬取,找到目标地址,开始研究网页代码格式,于是就开始根据之前学的知识进行爬取,出师不利啊,一开始爬取就出现了个问题,这是之前是没有遇到过的,明明地址没问题,就是显示网页不存在,于是就在百度 ...
随机推荐
- 基于MySQL自增ID字段增量扫描研究
目录 目录 1 1. 问题 1 2. 背景 1 3. InnoDB表 2 3.1. 自增ID为主键 2 3.2. 自增ID为普通索引 4 3.3. 原因分析 7 4. MyISAM表 8 4.1. 自 ...
- (动规 或 最短路)Help Jimmy(poj 1661)
http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的 ...
- TBB的学习
1. TBB简介 TBB ( Thread Building Blocks, 线程构建模块) 是Intel公司开发的并行编程开发的工具.它支持Windows,OS X, Linux平台,支持的编译器有 ...
- Mysql 分区(range,list,hash)转载
MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...
- UITabBarItem title 和self.title设置不同的标题
self.navigationItem.title = @"my title"; //sets navigation bar title. self.tabBarItem.titl ...
- Python自动化开发 - select模块
介绍: IO-多路复用:监听多个socker对象是否有变化,包括可读.可写.发送错误 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个 ...
- 解决UNIGUI字体太小的问题
解决UNIGUI字体太小的问题 Unigui运行在chrome浏览器下可以有最佳的效果,但用ie打开用unigui做的项目会发现字体明显小一截,可以用自定义css来解决这个问题. 可以在UniServ ...
- Android-Version Compatibility Issues (Gradle 2.14.1 requires Android Gradle plugin 2.1.3 (or newer)) but project is using
当AndroidStudio加载工程Project的时候,出现以上错误❌,千万不要点击,否则就是更多其他的错误: 解决方案: 1.认真翻译错误: 2.分析问题发生的原因,然后看到了 ..... ...
- JS通过ClassName禁止DIV点击
//通过ClassName获取div,使用setAttribute设置div禁止点击 var itemRoom= document.getElementsByClassName("page- ...
- 【CS】笔试常见题目
网络 IP地址分类 常见网络协议 HTTP状态码 算法 排序问题总结 git git和svn的区别 git常用命令 git暂存区,工作区等 一.网络 1. IP地址分类: IP网络使用32位地址,以点 ...