这是一篇学习http://www.cnblogs.com/kongzhagen/p/6549053.html的练习
1.创建工程
scrapy startproject movie
2.创建爬虫
cd movie
scrapy genspider meiju meijutt.com
3.自动创建目录
- scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
- items.py 设置数据存储模板,用于结构化数据,如:Django的Model
- pipelines 数据处理行为,如:一般结构化的数据持久化
- spiders 爬虫目录,如:创建文件,编写爬虫规则
- settings.py 配置文件,如:递归的层数、并发数,延迟下载等
- meiju.py 这是第二步里创建的爬虫文件
4.设置数据存储模板
items.py
import scrapy
class MovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field()
5.编写爬虫
meiju.py
# -*- coding: utf-8 -*-
import scrapy
from movie.items import MovieItem
class MeijuSpider(scrapy.Spider):
name = "meiju"
allowed_domains = ["meijutt.com"]
start_urls = ['https://www.meijutt.com/new100.html']
def parse(self, response):
movies = response.xpath('//ul[@class="top-list fn-clear"]/li')
for each_movie in movies:
item = MovieItem()
item['name'] = each_movie.xpath('./h5/a/@title').extract()[0]
yield item
6.设置配置文件
settings.py增加如下内容
ITEM_PIPELINES = {'movie.pipelines.MoviePipeline':100}
此处是设置数据读取的优先顺序,其实读一条数据的时候不需要加这个
7.编写数据处理脚本
pipelines.py
class MoviePipeline(object):
def process_item(self, item, spider):
with open("my_meiju.txt",'ab') as fp:
fp.write(item['name'].encode("utf8") + b'\r\n')
参考的原教程此处使用
with open("my_meiju.txt",'a') as fp:
fp.write(item['name'].encode("utf8") + '\n')
会发生TypeError: can’t concat str to bytes报错,报错的原因是“Python3给open函数添加了名为encoding的新参数,而这个新参数的默认值却是‘utf-8’。这样在文件句柄上进行read和write操作时,系统就要求开发者必须传入包含Unicode字符的实例,而不接受包含二进制数据的bytes实例。”所以把文件打开类型改为二进制的ab而不是文本类型的a,同时在‘\n’前添加b,但是这样更改会导致在txt里看到运行结果没有换行,而使用word打开meiju.txt则能看到换行,所以添加\r使得换行在txt中可见。
8.执行爬虫
cd movie
scrapy crawl meiju --nolog
nolog可以去除执行日志的显示,让命令行界面更干净,删除–nolog即可看到执行日志