爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 15215|回复: 2

[经验总结] 照葫芦画瓢:scrapy爬虫第一个项目

[复制链接]

新浪微博达人勋

发表于 2020-12-17 11:36:26 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
仔细研读《Python网络爬虫实战(第2版)》中scrapy爬取电影网站的案例,注解如下:

一、搭建框架

跟Django框架的套路一样,scrapy框架可以用命令直接生成目录结构和必要的文件,然后我们在此基础上,再按自己的需求改动。

在Terminal执行:
C:\Users\Administrator>G:
G:\>cd G:\
G:\>scrapy startproject todayMovie
这时,生成了类似Django项目的目录结构

然后,建立基础爬虫:

G:\>cd todayMovie
G:\todayMovie>scrapy genspider wuHanMovieSpider mtime.com
scrapy genspider命令创建了名为wuHanMovieSpider的爬虫脚本,搜索的是mtime.com

这时,项目目录结构和文件如下:

scrapy目录结构.jpg



密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2020-12-17 14:44:34 | 显示全部楼层
二、文件注解

生成的文件中,需要改的是4个:
settings.py pipelines.py items.py wuHanMovieSpider.py

2.1 settings.py

BOT_NAME = 'todayMovie'
SPIDER_MODULES = ['todayMovie.spiders']
NEWSPIDER_MODULE = 'todayMovie.spiders'
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {'todayMovie.pipelines.TodaymoviePipeline': 300}
#ITEM_PIPELINES字典,键是处理结果的类,值是这个类执行的顺序
#这里只有一种处理方式,值无所谓
#如果需要多种处理方法,就要确定顺序了,值越小越先执行


2.2 items.py

# 决定爬取哪些项目
import scrapy
class TodaymovieItem(scrapy.Item):
    movieTitleCn = scrapy.Field()#影片中文名
    movieTitleEn = scrapy.Field()#影片英文名
    director = scrapy.Field()#导演
    runtime = scrapy.Field()#电影时长


2.3 pipelines.py

# 决定爬取的内容怎么处理
#item来自wuHanMovieSpider的返回值,
#返回值是列表items,在这里只能逐个写入,所以是追加写入
import codecs
class TodaymoviePipeline(object):
    def process_item(self, item, spider):
        with codecs.open('当日电影表.txt', 'a+', 'utf-8') as fp:
            fp.write('%s  %s  %s  %s \r\n'
                    %(item['movieTitleCn'],
                        item['movieTitleEn'],
                        item['director'],
                        item['runtime']))


2.4 wuHanMovieSpider.py

import scrapy
import re
from todayMovie.items import TodaymovieItem
#即items.py

class WuhanmoviespiderSpider(scrapy.Spider):
    name = 'wuHanMovieSpider'
#name定义爬虫名
    allowed_domains = ['mtime.com']
#定义爬行的域范围,爬虫只在这个域爬行
    start_urls = ['http://theater.mtime.com/China_Hubei_Province_Wuhan_Wuchang/4316/']
   
# 爬行的网页,这个爬虫只需要爬一个网页,如果需要爬多个网页,start_urls列表写多个元素

    #parse=解析
    def parse(self, response):
        #response参数是请求网页后返回的数据
        #观察网页代码,第3个script中的文本有电影信息:
        selector = response.xpath('/html/body/script[3]/text()')[0].extract()
        print(selector)
        moviesStr = re.search('"movies":\[.*?\]', selector).group()
        moviesList = re.findall('{.*?}', moviesStr)
        items = []
        for movie in moviesList:
            mDic = eval(movie) #网页代码的写法正好类似python写法
            item = TodaymovieItem()
            item['movieTitleCn'] = mDic.get('movieTitleCn')
            item['movieTitleEn'] = mDic.get('movieTitleEn')
            item['director'] = mDic.get('director')
            item['runtime'] = mDic.get('runtime')
            items.append(item)
        return items

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-17 14:49:41 | 显示全部楼层
本帖最后由 15195775117 于 2020-12-17 15:38 编辑

三、爬虫结果

spiders文件夹内是项目所有的爬虫文件,
该项目的spider文件夹里只有一个爬虫,其实可以用多个
运行爬虫的方法:在Terminal中执行:
scrapy crawl wuHanMovieSpider

结果:
爬取结果.jpg


我的思考:
项目代码有些是用re解析网页的,我想着是不是该花半天时间把re练熟?
现在想想没必要,因为Beautiful Soup等更便利
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表