
5个组件:
2个中间件:
Scrapy操作文档(中文的):https://www.osgeo.cn/scrapy/topics/spider-middleware.html
cmd窗口,pip进行安装
pip install scrapy

Scrapy框架安装时常见的问题
找不到win32api模块----windows系统中常见
pip install pypiwin32
scrapy startproject xxx项目名称
实例:
scrapy startproject tubatu_scrapy_project


scrapy.cfg:项目的配置文件,定义了项目配置文件的路径等配置信息

cd到spiders目录下,输出如下命令,生成爬虫文件:
scrapy genspider 文件名 爬取的地址


方式一:cmd启动
cd到spiders目录下,执行如下命令,启动爬虫:
scrapy crawl 爬虫名

方式二:py文件启动
在项目下创建main.py文件,创建启动脚本,执行main.py启动文件,代码示例如下:
code-爬虫文件??
import scrapyclass TubatuSpider(scrapy.Spider): #名称不能重复 name = 'tubatu' #允许爬虫去抓取的域名 allowed_domains = ['xiaoguotu.to8to.com'] #项目启动之后要启动的爬虫文件 start_urls = ['https://xiaoguotu.to8to.com/pic_space1?page=1'] #默认的解析方法 def parse(self, response): print(response.text)
code-启动文件??
from scrapy import cmdline#在我们scrapy项目里面,为了方便运行scrapy的项目的时候创建的文件#使用cmdlie.execute()方法执行爬虫启动命令:scrapy crawl 爬虫名cmdline.execute("scrapy crawl tubatu".split()) #execute方法需要运行的每一个命令为单独的一个字符串,如:cmdline.execute(['scrapy', 'crawl', 'tubatu']),所以如果命令为一整个字符串时,需要split( )进行分割;#
code-运行结果??

爬取土巴兔装修网站信息。将爬取到的数据存入到本地MongoDB数据库中;
下图??为项目机构,标蓝的文件就是此次code的代码

1 import scrapy 2 from tubatu_scrapy_project.items import TubatuScrapyProjectItem 3 import re 4 5 class TubatuSpider(scrapy.Spider): 6 7 #名称不能重复 8 name = 'tubatu' 9 #允许爬虫去抓取的域名,超过这个目录就不允许抓取10 allowed_domains = ['xiaoguotu.to8to.com','wx.to8to.com','sz.to8to.com']11 #项目启动之后要启动的爬虫文件12 start_urls = ['https://xiaoguotu.to8to.com/pic_space1?page=1']13 14 15 #默认的解析方法16 def parse(self, response):17 # response后面可以直接使用xpath方法18 # response就是一个Html对象19 pic_item_list = response.xpath("//div[@class='item']")20 for item in pic_item_list[1:]:21 info = {}22 # 这里有一个点不要丢了,是说明在当前Item下面再次使用xpath23 # 返回的不仅仅是xpath定位中的text()内容,需要再过滤;返回如:[<Selector xpath='.//div/a/text()' data='0元搞定设计方案,限名额领取'>] <class 'scrapy.selector.unified.SelectorList'>24 # content_name = item.xpath('.//div/a/text()')25 26 #使用extract()方法获取item返回的data信息,返回的是列表27 # content_name = item.xpath('.//div/a/text()').extract()28 29 #使用extract_first()方法获取名称,数据;返回的是str类型30 #获取项目的名称,项目的数据31 info['content_name'] = item.xpath(".//a[@target='_blank']/@data-content_title").extract_first()32 33 #获取项目的URL34 info['content_url'] = "https:"+ item.xpath(".//a[@target='_blank']/@href").extract_first()35 36 #项目id37 content_id_search = re.compile(r"(\d+)\.html")38 info['content_id'] = str(content_id_search.search(info['content_url']).group(1))39 40 #使用yield来发送异步请求,使用的是scrapy.Request()方法进行发送,这个方法可以传cookie等,可以进到这个方法里面查看41 #回调函数callback,只写方法名称,不要调用方法42 yield scrapy.Request(url=info['content_url'],callback=self.handle_pic_parse,meta=info)43 44 if response.xpath("//a[@id='nextpageid']"):45 now_page = int(response.xpath("//div[@class='pages']/strong/text()").extract_first())46 next_page_url="https://xiaoguotu.to8to.com/pic_space1?page=%d" %(now_page+1)47 yield scrapy.Request(url=next_page_url,callback=self.parse)48 49 50 def handle_pic_parse(self,response):51 tu_batu_info = TubatuScrapyProjectItem()52 #图片的地址53 tu_batu_info["pic_url"]=response.xpath("//div[@class='img_div_tag']/img/@src").extract_first()54 #昵称55 tu_batu_info["nick_name"]=response.xpath("//p/i[@id='nick']/text()").extract_first()56 #图片的名称57 tu_batu_info["pic_name"]=response.xpath("//div[@class='pic_author']/h1/text()").extract_first()58 #项目的名称59 tu_batu_info["content_name"]=response.request.meta['content_name']60 # 项目id61 tu_batu_info["content_id"]=response.request.meta['content_id']62 #项目的URL63 tu_batu_info["content_url"]=response.request.meta['content_url']64 #yield到piplines,我们通过settings.py里面启用,如果不启用,将无法使用65 yield tu_batu_info
1 # Define here the models for your scraped items 2 # 3 # See documentation in: 4 # https://docs.scrapy.org/en/latest/topics/items.html 5 6 import scrapy 7 8 9 class TubatuScrapyProjectItem(scrapy.Item):10 # define the fields for your item here like:11 # name = scrapy.Field()12 13 #装修名称14 content_name=scrapy.Field()15 #装修id16 content_id = scrapy.Field()17 #请求url18 content_url=scrapy.Field()19 #昵称20 nick_name=scrapy.Field()21 #图片的url22 pic_url=scrapy.Field()23 #图片的名称24 pic_name=scrapy.Field()
1 # Define your item pipelines here 2 # 3 # Don't forget to add your pipeline to the ITEM_PIPELINES setting 4 # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html 5 6 7 # useful for handling different item types with a single interface 8 from itemadapter import ItemAdapter 9 10 from pymongo import MongoClient11 12 class TubatuScrapyProjectPipeline:13 14 def __init__(self):15 client = MongoClient(host="localhost",16 port=27017,17 username="admin",18 password="123456")19 mydb=client['db_tubatu']20 self.mycollection = mydb['collection_tubatu']21 22 def process_item(self, item, spider):23 data = dict(item)24 self.mycollection.insert_one(data)25 return item

1 from scrapy import cmdline2 3 #在我们scrapy项目里面,为了方便运行scrapy的项目的时候创建的文件4 #使用cmdlie.execute()方法执行爬虫启动命令:scrapy crawl 爬虫名5 cmdline.execute("scrapy crawl tubatu".split()) #execute方法需要运行的每一个命令为单独的一个字符串,如:cmdline.execute(['scrapy', 'crawl', 'tubatu']),所以如果命令为一整个字符串时,需要split( )进行分割;#