1、安装并配置anaconda环境
2、配置anaconda环境的镜像:
conda config --add channels 镜像地址
conda config --set show_channel_urls yes
执行命令之后会在c:\users\username\下生成一个.condaarc文件,可以使用编辑器直接修改
3、安装scrapy
conda install scrapy
1、创建一个scrapy项目
scrapy startproject helloworld
2、项目结构如下:
scrapy.cfg:部署配置文件
helloworld:项目的python模块,从此处导入你的代码
items.py:数据项定义
middlewares.py:定义下载器中间件和蜘蛛中间件的位置
piplines.py:定义Item Pipline,实现数据的清洗、储存、验证
settings.py:全局配置
spiders:用于放置爬虫的目录
3、创建一个spider
打开一个终端,将当前目录切换到spiders下,然后执行命令
scrapy genspider demo maoyan.com
scrapy会创建一个py文件,内容如下
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo' # 项目的名字
allowed_domains = ['maoyan.com'] # 允许爬取的域名
start_urls = ['http://maoyan.com/'] # 爬取的网站,可以定义多个初始的url
# 请求初始url之后执行的方法,主要用于对网页的解析与获取想要的数据
# response 请求网页后返回的内容
def parse(self, response):
pass
4、定义items
item是保存爬取数据的容器,定义方式和字典类似
import scrapy
class HelloworldItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
index = scrapy.Field()
title = scrapy.Field()
star = scrapy.Field()
release_time = scrapy.Field()
score = scrapy.Field()
5、实现parse方法
# -*- coding: utf-8 -*-
import scrapy
from helloworld.items import HelloworldItem
class DemoSpider(scrapy.Spider):
name = 'demo'
allowed_domains = ['maoyan.com']
start_urls = ['http://maoyan.com/']
def parse(self, response):
dl = response.css(':board-wrapper dd')
for dd in dl:
item = HelloworldItem()
item.index = dd.css('.board-index::text').extract_first()
item.title = dd.css('.name a::text').extract_first()
item.star = dd.css('.star::text').extract_first()
item.release_time = dd.css('.releasetime::text').extract_first()
item.score = dd.css('integer::text').extract_first()+dd.css('.fraction::text').extract_first()
yield item
6、运行
将目录切换到scrapy.cfg所在目录下,并执行以下命令
scrapy crawl demo
1、在spiders路径下创建一个py文件qutoes_spider.py,定义一个Spider如下
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes" # 唯一标识爬虫
# 返回爬虫开始爬取的url
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse) # yield关键字与python的生成器有关,生成器中的元素只能被遍历一次
# 处理每个请求得到的响应,通常用于处理响应、将爬取的数据抽取为字典或json、检索并添加新的请求
def parse(self, response):
page = response.url.split('/')[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body) # 将响应存储为文件
self.log('Saved file %s' % filename)
运行过程:Scrapy逐个发出request请求,一旦收到响应就立即创建一个Response对象,并执行与对应请求绑定的函数,将Response对象作为参数传入该函数(在本例中这个函数是parse)
对start_requests方法的简化:可以不定义这个方法,而是直接定义一个list类型的类属性
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
...
提取数据:提取数据的最好方法是使用scrapy shell
scrapy shell "http://quotes.toscrape.com/page/1/"
在shell中可以利用css和response对象选择各个节点。
response.css('title') # 返回值是一个类似list的对象SelectorList,其中每一个元素的类型是Selector,封装着xml/html元素并允许继续进行细粒度的检索