主要学习如何通过抓包工具分析简书的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. 1.gil全局解释器锁, 2. 死锁与递归锁 3. 信号量 4. Event事件 5. 线程queue

    gil本质就是一把互斥锁,相当于执行权限,每个进程都会存在一把gil,同一进程内的多个线程必须抢到gil 之后才能使用cpython解释器来执行自己的代码,同一进程下的多线程不能并行,但可以实现并发 ...

  2. BAT的真的适合创业团队吗?

    平时在公司扮演一个逗比得角色和亲爱的们友好相处的我根本不愿意去思考这么深入的课题.本来在上一家公司就涉及的太深,心爱的一条小产品线被咔掉后心疼不已.只想深入研究技术不问世事了.怎奈何突然有一天说要招一 ...

  3. 批量插入,批量修改的sql

    sql 1  批量插入 <insert id="batchInsert" useGeneratedKeys="true" parameterType=&q ...

  4. Spring的两种代理JDK和CGLIB的区别浅谈

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

  5. Android 如何通过浏览器打开App

    首先给出参考资料http://my.oschina.net/liucundong/blog/354029?p=3#rpl_291191828 通过浏览器直接打开Android应用程序 Android ...

  6. java web开发遇到的常见问题解决办法(汇总贴)

    1. maven下载jar包失败,重复 maven --> update project 不管用 解决办法:  1.打开本地仓库所在目录, 通过win文件夹的搜索功能,查找 *.lastUpda ...

  7. JMS学习以及jms的实现activeMq

    1.JMS规范介绍: http://www.cnblogs.com/hapjin/p/5431706.html http://elim.iteye.com/blog/1893038 http://bl ...

  8. CAD2007_DWG转PDF

    在使用CAD时,我们可能经常要将DWG转PDF格式,操作步骤如下: 1)打开需要转换的DWG文件 2)文件---->页面设置管理器----->修改----->(到“页面设置--模型” ...

  9. 利用 LibWebP-NET 解码与编码 WebP 格式图片

    此文以后将会在我的新博客更新,有任何疑问可在我的新博文中提出 https://blog.clso.fun/posts/2019-03-02/vb-net-webp.html WebP 格式是谷歌开发并 ...

  10. ASP.Net Core 2.2 MVC入门到基本使用系列 (二)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...