python爬取ajax异步加载_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异步加载网页

欢迎关注博主主页,学习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中的内容.

你可能感兴趣的:(python爬取ajax异步加载_Scrapy爬取Ajax(异步加载)网页实例——简书付费连载)