主要学习如何通过抓包工具分析简书的Ajax加载,有时间再写一个Multithread proxy spider提升效率。

1. 关键点:

使用单线程爬取,未登录,爬取简书主页Ajax加载的内容。主要有三个关键点:

  • 抓包抓到的X-INFINITESCROLL: trueX-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爬取简书主页信息的更多相关文章

  1. python 爬取简书评论

    import json import requests from lxml import etree from time import sleep url = "https://www.ji ...

  2. python3 爬取简书30日热门,同时存储到txt与mongodb中

    初学python,记录学习过程. 新上榜,七日热门等同理. 此次主要为了学习python中对mongodb的操作,顺便巩固requests与BeautifulSoup. 点击,得到URL https: ...

  3. Node爬取简书首页文章

    Node爬取简书首页文章 博主刚学node,打算写个爬虫练练手,这次的爬虫目标是简书的首页文章 流程分析 使用superagent发送http请求到服务端,获取HTML文本 用cheerio解析获得的 ...

  4. Scrapy+selenium爬取简书全站

    Scrapy+selenium爬取简书全站 环境 Ubuntu 18.04 Python 3.8 Scrapy 2.1 爬取内容 文字标题 作者 作者头像 发布日期 内容 文章连接 文章ID 思路 分 ...

  5. python2.7 爬取简书30日热门专题文章之简单分析_20170207

    昨天在简书上写了用Scrapy抓取简书30日热门文章,对scrapy是刚接触,跨页面抓取以及在pipelines里调用settings,连接mysql等还不是很熟悉,今天依旧以单独的py文件区去抓取数 ...

  6. 用Python爬取智联招聘信息做职业规划

    上学期在实验室发表时写了一个爬取智联招牌信息的爬虫. 操作流程大致分为:信息爬取——数据结构化——存入数据库——所需技能等分词统计——数据可视化 1.数据爬取 job = "通信工程师&qu ...

  7. python爬取 “得到” App 电子书信息

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 静觅 崔庆才 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  8. Python爬取房天下二手房信息

    一.相关知识 BeautifulSoup4使用 python将信息写入csv import csv with open("11.csv","w") as csv ...

  9. python爬取北京政府信件信息01

    python爬取,找到目标地址,开始研究网页代码格式,于是就开始根据之前学的知识进行爬取,出师不利啊,一开始爬取就出现了个问题,这是之前是没有遇到过的,明明地址没问题,就是显示网页不存在,于是就在百度 ...

随机推荐

  1. Redis模块开发示例

    实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作: 2) incrby同时设置一个key的过期时间 在没有module之前,需要借助eval ...

  2. 2.3.5使用原子类进行i++操作

    除了在i++操作时使用synchronized关键字实现同步外,还可以使用AtomicInteger原子类进行实现 原子操作时不可分割的整体,没有其他线程能够中断或检查正在原子操作的变量,一个原子类型 ...

  3. day3用户交互,格式化输出,数据类型,流程控制

    上节课复习: 1.运行python程序的三步骤:python test.py 1.先启动python解释器 2.将test.py的内容当作普通的字符读入内存 3.python解释器解释执行刚刚读入内存 ...

  4. virtualbox centos 连接网络

    一.设置网络 设置 -> 网络 -> 连接方式:桥接网卡.设置当前连网络的界面名称.接入网线打勾 二.开启eth0 vi /etc/sysconfig/network-scripts/if ...

  5. Java数据类型、操作符、表达式

    基本与C#相同,因C#从Java学的   如操作符     对象的Equals方法,比较两个对象的内容是否相等.     ==是比较是否引用同一对象.

  6. Forward团队-爬虫豆瓣top250项目-团队编程项目开发环境搭建过程

    本次结对编程和团队项目我都需要用python环境,所以环境的搭建是一样的.(本文部分内容引用自己博客:http://www.cnblogs.com/xingyunqi/p/7527411.html) ...

  7. spark checkpoint详解

    checkpoint在spark中主要有两块应用:一块是在spark core中对RDD做checkpoint,可以切断做checkpoint RDD的依赖关系,将RDD数据保存到可靠存储(如HDFS ...

  8. 主题模型之潜在语义分析(Latent Semantic Analysis)

    主题模型(Topic Models)是一套试图在大量文档中发现潜在主题结构的机器学习模型,主题模型通过分析文本中的词来发现文档中的主题.主题之间的联系方式和主题的发展.通过主题模型可以使我们组织和总结 ...

  9. hdu 5047 大数找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...

  10. 背水一战 Windows 10 (42) - 控件(导航类): Frame 动画

    [源码下载] 背水一战 Windows 10 (42) - 控件(导航类): Frame 动画 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) Frame 动画 示例An ...