Scrapy爬取Ajax(异步加载)网页实例——简书付费连载
这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页。
这里以简书里的优选连载网页为例分享一下我的爬取过程。
网址为:
https://www.jianshu.com/mobile/books?category_id=284
一、分析网页
进入之后,鼠标下拉发现内容会不断更新,网址信息也没有发生变化,于是就可以判断这个网页使用了异步加载技术。
f
首先明确爬取的内容,本次我爬取的是作品名称、照片、作者、阅读量。然后将照片下载存储在文件夹中,然后将全部内容生成csv文件夹保存。
查看网页源代码发现代码里只有已加载的作品的内容,编写爬虫代码发现爬取不到收录的信息。
进入Network选项,勾选XHR选项,通过下滑网页发现Network选项卡会加载文件,如下图:
注:这里我用的是火狐浏览器
点击其中一个加载文件,可以在消息头看到请求网址:
继续下滑,发现Headers部分请求的URL只是page后面的数字在改变,通过改变数字,我们就能在后面调用回调函数爬取多个网页了。
二、Scrapy爬取
1.在命令提示符输入:
cd Desktop #进入桌面
scrapy startproject jian #生成名为jian的Scrapy文件夹 cd jian
scrapy genspider lianzai jianshu.com #爬虫名为lianzai
这里我用的是pycharm,打开文件夹。
2.在items.py定义爬虫字段
class JianItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
book_name=scrapy.Field()
img=scrapy.Field()
author=scrapy.Field()
readers=scrapy.Field()
pass
3.在lianzai.py编写爬虫代码,爬取数据
# -*- coding: utf-8 -*-
import scrapy
from jian.items import JianItem
import json
import requests class LianzaiSpider(scrapy.Spider):
name = 'lianzai'
allowed_domains = ['jianshu.com']
start_urls = ['https://www.jianshu.com/asimov/books?page=1&count=12&category_id=284'] #第一页的url
def parse(self, response):
data=json.loads(response.body) #str转为json对象
try:
for i in range(0, 12):
item = JianItem()
img=data['books'][i]['image_url']
book_name=data['books'][i]['name']
author=data['books'][i]['user']['nickname']
readers=data['books'][i]['views_count'] item['img']=img
item['book_name']=book_name
item['author']=author
item['readers']=readers
yield item #返回数据
except IndexError:
pass
urls=['https://www.jianshu.com/asimov/books?page={}&count=12&category_id=284'.format(str(i))for i in range(2, 11)] #
for url in urls:
yield scrapy.Request(url,callback=self.parse) #回调函数
这里特别要注意的是要爬取内容的所在位置。
上图中左图可以看出爬取的内容的位置在response里的['books']里面,且一个网页有12个作品,因此上面循环出为(0,12)。
打开后如上右图,可以看到我们要爬取的作品名、图片地址、作者、阅读量都在里面,爬取就相对容易了。
4.在setting.py设置爬虫配置
USER_AGENT='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36' #请求头
DOWNLOAD_DELAY=0.5 #延时0.5
FEED_URI='file:C:/Users/lenovo/Desktop/jianshulianzai.csv' #在桌面生成CSV文件
FEED_FORMAT='csv' #存入
ITEM_PIPELINES={'jian.pipelines.JianPipeline':300}
5.在pipelines.py处理照片数据
# -*- coding: utf-8 -*- # Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import os
import urllib.request class JianPipeline(object):
def process_item(self, item, spider):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'
}
try:
if item['img'] != None:
req=urllib.request.Request(url=item['img'],headers=headers)
res=urllib.request.urlopen(req)
file_name = os.path.join(r'C:\Users\lenovo\Desktop\my_pic', item['book_name'] + '.jpg')
with open(file_name,'wb')as f:
f.write(res.read())
except urllib.request.URLError:
pass
return item
6.全部保存后,在命令行终端输入:
scrapy crawl lianzai
就将结果爬取下来并保存啦。
三、结果
.csv文件的内容:
下载的照片:
初入爬虫,还有很多不足需要改正,还有很多知识需要学习,希望有疑问或建议的朋友多多指正或留言。谢谢。
Scrapy爬取Ajax(异步加载)网页实例——简书付费连载的更多相关文章
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- 爬虫——爬取Ajax动态加载网页
常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 ...
- Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页
1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...
- scrapy项目5:爬取ajax形式加载的数据,并用ImagePipeline保存图片
1.目标分析: 我们想要获取的数据为如下图: 1).每本书的名称 2).每本书的价格 3).每本书的简介 2.网页分析: 网站url:http://e.dangdang.com/list-WY1-dd ...
- htmlunit爬取js异步加载后的页面
直接上代码: 一. index.html 调用后台请求获取content中的内容. <html> <head> <script type="text/javas ...
- 淘宝购物车页面 智能搜索框Ajax异步加载数据
如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...
- jQuery的AJax异步加载
主要用到load()方法以及getScript()方法,具体以一个例子说明: 在现有html文件中加载一个拟好的片段,以及在片段加载完成之前阻止用户进一步操作的弹出框. 首先是现有html代码,无任何 ...
- ajax异步加载问题
使用ajax异步加载数据,在之后需要用到这个数据时,应该将之后的js一并写入ajax函数中,否则后面的js不能找到动态拼接的dom节点. 或者将其封装成方法,在ajax动态加载数据的最后调用该方法.
- Ajax 异步加载
AJAX (Asynchronous JavaScript and XML,异步的 JavaScript 和 XML).它不是新的编程语言,而是一种使用现有标准的新方法,是在不重新加载整个页面的情况下 ...
随机推荐
- 为什么「margin:auto」可以让块级元素水平居中?
知乎链接:http://www.zhihu.com/question/21644198 关于BFC的解释:W3CFans http://www.w3cfuns.com/thread-5595727-1 ...
- 云计算一:VMware workstation的安装和使用教程
VMware workstation的安装和使用教程 一.VMware 安装 1.从网上找到VMware的安装包以及要安装的映像文件,下载到本地,然后备份一份存储到百度云盘. 链接:http://pa ...
- WEB自动化(Python+selenium)的API
在做Web自动化过程中,汇总了Python+selenium的API相关方法,给公司里的同事做了第二次培训,分享给大家 ...
- Ubuntu命令操作
1../ 当前路径2.ls 列举当前路径下的所有文件及文件夹 默认情况不显示隐藏文件 ls -a 显示隐藏文件 ls -lah h是文件大小 l是显示文件3.cd 跳转路径4.pwd 查看当前所在路径 ...
- 【问题】sql数据库报无效的数据证书,需重新安装
事情的经过: 今天打开sql2014数据库,没有成功运行,但是给我弹出一个"无效的数据证书,需要重新安装!"提示.什么情况.为什么,应该是前一天弄vs导致的.因为升级了vs2017 ...
- restrict关键字(暗示编译器,某个指针指向的空间,只能从该指针访问)
我们希望某个对象(内存空间)不被修改的通常做法是什么?声明该空间的const类型,但是这样真的可以吗?是不是的,由于const空间对象的指针是可以付给一个非const值指针的.所以这仍然无法不让该空间 ...
- Tiny4412之串口(Uart)驱动编写
一:tiny4412串口驱动编写 1.串口通信简介 串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口 ...
- 使用Docker镜像和仓库
https://www.rhel.cc/2014/11/50/ 学习目标: 什么是镜像 docker镜像是由文件系统折叠加而成的,最低端是一个引导文件系统,即bootfs: 如何对镜像进行管理 使 ...
- CentOS 7安装Python3.6过程(让linux系统共存Python2和Python3环境)
CentOS 7系统自带了python2,不过可以不用2版本,直接使用python3运行python脚本就可以,但是千万别去动系统自带的python2,因为有程序依赖目前的python2环境,比如yu ...
- Using variables inside Postman and Collection Runner
Variables are among the most powerful features in Postman. Using variables in your Postman requests, ...