1、新建项目
scrapy startproject 项目名称
例如:scrapy startproject douban
2、创建爬虫任务
首先进入到项目
cd douban
scrapy genspider 爬虫名称 网址
例如:scrapy genspider doubanmovie https://movie.douban.com/chart
执行完命令后你项目的spiders目录下就会生成一个doubanmovie的py文件,这个生成的文件可以理解为
上一篇文章的第7步,所有的爬虫逻辑都在这里写。

3、分析要爬虫数据(Selectors选择器)
Scrapy处理数据有自己的一套工具叫selector选择器,它们通常通过特定的Xpath或Css选择器来定位取出HTML的某些内容,基于parsel模块。
方法:
1、xpath():传入xpath表达式,返回该表达式所对应的节点列表;(常用,必会,简单)2、css():传入css表达式,返回该表达式所对应的节点列表;(常用,必会,简单,和xpath类似)3、extract():序列化该节点为Unicode字符串并返回所对应的节点列表;(不常用,不用必会,简单)4、re():传入正则表达式,返回根据正则表达式提取所对应的Unicode字符串节点列表(常用,必会,困难)这里使用第一种,xpath:是一门用来在xml文件中选择节点的语言,也可以用在html上。
首先打开要爬虫的地址,点击F12使用xpath元素定位选择要抓取的数据,不懂xpath选择器的可以参考这篇文章
xpath工具:
xpath helper(可以在Chrome应用商店中下载)
代码部分:
import scrapy
class DoubanmovieSpider(scrapy.Spider):
# 爬虫id 唯一
name = 'doubanmovie'
# 允许采集的域名(所有采集的数据仅限在当前域名下)
allowed_domains = ['movie.douban.com']
# 开始采集的网站
start_urls = ['https://movie.douban.com/chart/']
# 解析响应的数据,可以理解为一个http请求的的response
def parse(self, response):
# 整个div的数据
divResultList = response.xpath("//div[@class='pl2']")
i = 1
for result in divResultList:
data = {}
print("第"+str(i)+"名")
name = result.xpath(".//a/text()").extract_first().replace('/', '').strip()
aliasName = result.xpath(".//a/span/text()").extract_first()
info = result.xpath(".//p/text()").extract_first()
rank = result.xpath(".//span[@class='rating_nums']/text()").extract_first()
rankPeople = result.xpath(".//span[@class='pl']/text()").extract_first()
# print("电影名称:"+name)
# print("电影别名:"+aliasName)
# print("电影简介:"+info)
# print("电影评分:"+rank)
# print("评分人数:"+rankPeople)
# print("\n")
i = i+1
data['name'] = name
data['aliasName'] = aliasName
data['info'] = info
data['rank'] = rank
data['rankPeople'] = rankPeople
yield data
pass
代码分析:
①这里我们首先获取到了豆瓣电影版,就是上图代码中的divResultList
如图:
现在获取的是整个div,可以看到result有10个,我们要获取的就是这10个list
②现在我们循环这个10个list的div,依次取出每个list中的对象
例如电影名称就是

代码中的取元素前的.是根据当前元素继续往下查找,说白了就是拼接上上边的xpath
下面依次取出电影别名、电影简介等。。。
4、运行爬虫文件
写完爬虫逻辑后在项目根目录下运行
scrapy crawl + 爬虫id
例如:scrapy crawl doubanmovie
即可运行爬虫文件
接下来你肯定会出现一个错误:

HTTP status code is not handled or not allowed
去setting.py设置一个useragent即可
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36’

可以看到我们的数据成功输出在了控制台里
5、保存数据
保存数据你可以输出text,保存到mysql、MongoDB里都嗯可以,这里我们选择保存到MongoDB。
第一步:
首先要在setting.py里开启你的pipelines管道

第二步:
编写管道信息
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
import pymongo
from itemadapter import ItemAdapter
class MoviedoubanspiderPipeline:
def process_item(self, item, spider):
self.table.insert_one(item)
return item
def __init__(self):
client = pymongo.MongoClient("mongodb://192.168.10.15:28017/")
db = client['doubanmovie']
self.table = db['doubanmovie']
pass
执行
scrapy crawl doubanmovie
保存结果:

