python-scrapy框架爬取某瓣电视剧信息--异步加载页面

前期准备,首先要有python环境+scrapy环境+pycharm环境

一、建立爬虫所需的环境,在命令行输入:

scrapy startproject doubantv  #命名自定义就好

会生成一个名为doubantv的文件夹,cd进入doubantv文件夹,在进入spiders文件夹,执行命令,新建爬虫文件:

scrapy gensipder tv "https://movie.douban.com"  #注明爬虫文件名,要爬取的网址域

然后就可以用pycharm打开doubantv文件了。

二、编写爬虫文件

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E8%A7%86%E5%89%A7&start=0#爬取的网址

我们会发现这个页面是通过ajax异步加载来不断获取页面的,通过我们细心的观察不难发现,每次加载页面都会出现一个有规律的网址,也就是上面给出的这个网址。因此我们就可以非常轻松的获取完整的页面信息了。

首先添加想要爬取的字段信息。

由于我们只是个人学习测试使用,所以就随机选择几个字段进行爬取:

在iteam文件编写
import scrapy


class DoubantvItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 导演
    directors = scrapy.Field()
    # 评分
    rate = scrapy.Field()
    # 标题
    title = scrapy.Field()
    # 跟进连接
    url = scrapy.Field()
    # 图片
    cover = scrapy.Field()

然后就是编写spiders内的爬虫文件了:

编写tv.py

# -*- coding: utf-8 -*-
import json

import scrapy
from doubantv.items import DoubantvItem

class TvSpider(scrapy.Spider):
    name = 'tv'
    allowed_domains = ['movie.douban.com']  #爬取域
    offset = 0
    url = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E8%A7%86%E5%89%A7&start='  #爬取的链接
  #格式化的url,注意逗号不要少
    start_urls = (
        url + str(offset),   
    )
  #主函数 def parse(self, response):     #将相应问价转换成json形式 datas
= json.loads(response.text)["data"]
    #遍历数组获取内容
for data in datas: item = DoubantvItem() # 导演 item['directors'] = data['directors'] # 评分 item['rate'] = data['rate'] # 标题 item['title'] = data['title'] # 跟进连接 item['url'] = data['url'] # 图片 item['cover'] = data['cover'] #传送到管道文件
       
yield item
    #获取封面图片url
for data in datas: # 图片 image = data['cover']
       #传送到管道文件
yield scrapy.Request(image, callback=self.parse)
    #自定义爬取响应地址数,我这里随意设置了一个20000
if self.offset < 20000: self.offset += 20
       #每次调用函数回滚,重复递归执行
yield scrapy.Request(self.url + str(self.offset), callback=self.parse)

接下来我们编写管道文件:

编写pipelines文件

import os
import urllib
from urllib.request import urlretrieve


class DoubantvPipeline(object):
  #初始化响应文件,建立一个doubantv.txt文件,和一个用户存放图片的目录 def __init__(self): self.filename
= open("doubantv.txt", "wb") self.path = "G:imagesp" self.page = 0
     #没有就新建一个
if not os.path.exists(self.path): os.mkdir(self.path)   #保存文件信息的函数 def process_item(self, item, spider): print("------------------------------------------------------") directors = item["directors"] rate = item["rate"] title = item["title"] url = item["url"] cover = item["cover"] print("---------------------------------------------------")
    #这里我们随机保存了一个内容 self.filename.write(title.encode(
'utf-8') + ' '.encode('utf-8') + rate.encode('utf-8') + ' '.encode('utf-8'))     #保存图片文件到预定的目录 src = item['cover'] pathname = os.path.join(self.path, str(self.page) + cover + '.jpg') try: res = urllib.request.urlopen(src) #下载图片文件 with open(pathname, 'wb') as f: f.write(res.read()) self.page += 1 except Exception as e: print(e) return item   #关闭文件,释放内存 def colse_spider(self, spider): self.filename.close()

然后执行爬虫文件:

在跟目录下执行

scrapy crawl tv

耐性等待片刻后。。。

去他*的世界 第二季   9.2
致命女人 第一季   9.3
去他*的世界 第一季   9.1
摩登情爱 第一季   8.7
鹤唳华亭   7.4
从前有座灵剑山   7.4
美国恐怖故事:1984 第九季   7.4
谍战深海之惊蛰   6.5
请回答1988   9.7
。。。。。。。。。

 

 OVER

原文地址:https://www.cnblogs.com/jake-jin/p/11918414.html