(二)爬虫框架(2)——第一个scrapy爬虫
2018-09-21 本文已影响0人
爱折腾的胖子
scrapy简介中简单介绍了scrapy爬虫,这节就深入的研究一下scrapy的各个模块的使用方法。
首先创建爬虫,在命令行中使用 scrapy startproject 项目名
项目目录
可以看到目录中有一个scrapy.cfg文件,这个文件是scrapy项目的配置文件。
items.py:可以自定义item类,做为数据模型。
middlewares.py:可以自定义中间件。
pipelines.py:可以自定义Pipeline类,进行数据清洗,存储。
settings.py:爬虫的配置文件,例如可以设置爬虫的等待时间、并发数量等等。
还有两个__init__.py文件,打开看可以发现什么都没有,但是并不能删除。
创建好爬虫项目,也简略分析了每个文件的作用,可以发现一点,并没有哪个文件是给用户写爬虫逻辑的。
此时就需要下一条命令了, scrapy genspider 爬虫名 爬取的域名
项目目录
可以看到spiders文件夹中多了一个movie_spider.py的文件,打开看一下:
import scrapy
class MovieSpiderSpider(scrapy.Spider):
name = 'movie_spider' #爬虫名称
allowed_domains = ['www.ygdy8.net'] #允许访问的域名
start_urls = ['http://www.ygdy8.net/'] #爬虫爬取的url
def parse(self, response):
"""
处理返回的Response
"""
pass
接下来,我们就把爬虫的逻辑完善一下,做一个爬取阳光电影的爬虫,记录一下电影名字和下载地址。
首先在items.py中创建一个item类:
# -*- coding: utf-8 -*-
import scrapy
class FirstScrapyItem(scrapy.Item):
title = scrapy.Field()
download_url = scrapy.Field()
然后完善一下爬虫的代码:
# -*- coding: utf-8 -*-
import scrapy
from urllib import parse
from .. import items
class MovieSpiderSpider(scrapy.Spider):
name = 'movie_spider'
allowed_domains = ['www.ygdy8.net'] # 允许访问的域名
start_urls = [
'http://www.ygdy8.net/html/gndy/dyzz/list_23_1.html',
'http://www.ygdy8.net/html/gndy/dyzz/list_23_2.html',
'http://www.ygdy8.net/html/gndy/dyzz/list_23_3.html',
'http://www.ygdy8.net/html/gndy/dyzz/list_23_4.html',
'http://www.ygdy8.net/html/gndy/dyzz/list_23_5.html'
] # 电影天堂最新电影 前五页
def parse(self, response):
"""
处理返回的Response
"""
#获取信息列表
table_list = response.xpath("//*[@class=\"co_content8\"]/ul/td/table")
for table in table_list:
#获取详情页url,并且把url让如到Scheduler中,等待爬取
url = table.xpath("./tr[2]/td[2]/b/a/@href").extract()[0]
yield scrapy.Request(parse.urljoin(response.url, url), callback=self.parse_detail)
def parse_detail(self, response):
# print(response.body.decode("gbk"))
content = response.xpath("//*[@class=\"bd3r\"]")
item = items.FirstScrapyItem()
item["title"] = content.xpath("./div[@class=\"co_area2\"]/div[@class=\"title_all\"]/h1/font/text()").extract()[0]
item["download_url"] = content.xpath("./div[@class=\"co_area2\"]/div[@class=\"co_content8\"]/ul/tr[3]/td[1]/div[@align=\"left\"]/div[@id=\"Zoom\"]/td/table/tbody/tr/td/a/@href").extract()[0]
yield item
然后再写一个管道,处理抓取的信息,暂时先写入到文本中,使用json格式:
# -*- coding: utf-8 -*-
import json
class FirstScrapyPipeline(object):
def __init__(self):
self.file = open("data.json", "w")
def process_item(self, item, spider):
text = json.dumps(dict(item), ensure_ascii=False) + "," + "\n"
self.file.write(text)
return item
def close_spider(self, spider) :
self.file.close()
最后配置一下settings.py文件
# -*- coding: utf-8 -*-
BOT_NAME = 'first_scrapy'
SPIDER_MODULES = ['first_scrapy.spiders']
NEWSPIDER_MODULE = 'first_scrapy.spiders'
#不遵守robot.txt协议
ROBOTSTXT_OBEY = False
#设置一下默认的header信息
DEFAULT_REQUEST_HEADERS = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}
#开启自定义的管道
ITEM_PIPELINES = {
'first_scrapy.pipelines.FirstScrapyPipeline': 300,
}
最后在使用命令 scrapy crawl movie_spider
运行爬虫,如果没有异常,则会在项目根目录中出现一个data.json文件,里面存储的就是爬取的数据。
至此,第一个scrapy案例结束。