Scrapy 使用教程

随笔2个月前发布 浅浅浅寒
52 0 0

1.使用 Anaconda 下载
conda install scrapy

2.使用scrapy 框架创建工程,或者是启动项目
scrapy startproject 工程名

工程目录,下图是在 pycharm 下的工程目录
Scrapy 使用教程
这里的douban是我自己的项目名
爬虫的代码都写在 spiders 目录下,spiders->testdouban.py是创建的其中一个爬虫的名称。
1)、spiders 文件夹:爬虫文件主目录
2)、init.py:将改文件夹变为一个python模块
3)、items.py:定义所需要爬虫的项目
4)、middlewares.py:爬虫中间件
5)、pipelines.py:管道文件
6)、settings.py:设置文件

3.在spider 文件夹内编写爬虫文件

固定结构:

from scrapy.spiders import CrawlSpider
from scrapy.selector import Selector
from scrapy.http import Request  # 需要yield 请求解析时使用;抓取多页的时候使用
from 项目名.items import 项目名item

class 项目名(CrawlSpider):
    name = '文件名'
    # allow_domains = 'xxx' # 规定某域名

    # 必写: start_urls = 列表 ,放置url字符串
    start_urls = []

    # 必写,负责提取内容,提交item到管道
    def parse(self,response):
        # 实例化item对象
        item = 项目名Item()
    	# 可以使用正则、beautifulsoup、xpath来解析 
		# 准备 item,传入items 里面;将数据放到item内,用字典赋值的方式
		item['key'] = key
		# yield 提交
		yield item
		
		# 将 item 提交给 解析 详情页的 函数(非必写)
        # Request(具体的详情页网址,callback= 指定的函数名称,meta={'item_front':item)
        # 举例:   
        # yield  Request(url,callback=self.parse_detail,meta={'item_front':item}  )
        
	# 非必写
	def parse_detail(self.response):
		# 从response 内把之前存入的item 提取出来
		item = response.meta['item_front']
		#解析
		...
		yield item
		

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

4 . 到 items.py里面添加字段
添加字段的格式,举例:name = scrapy.Field()

5.存储

1)使用scrapy的默认存储,相对简单
settings.py 里面添加存储的文件名和格式,如下:

	FEED_URI = '文件名.csv'
    FEED_FORMAT = 'CSV'

  • 1
  • 2

2)自定义存储

在 pipelines.py 内
class SaveToCsv(object):
    # 爬虫初始化时运行 。一般做做准备,创建文件对象
    def __init__(self):
        self.file = open('ip.csv','w',encoding='utf-8',newline='')
        self.csvfile = csv.writer(self.file)
        # 可以写入一个首行
        self.csvfile.writerow(['ip地址','端口号','类型','存活时间'])
    # 提交 item 的过程
    def process_item(self, item, spider):
        each = list(item.values())
        self.csvfile.writerow(each)
        return item
    # 爬虫关闭时,做什么
    def close_spider(self, spider):
        self.file.close()
        print('csv存储结束')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

6. 浏览器头部与代理IP的添加

在 middlewares.py 中找到下面的方法,然后在该方法中编写:
 
class xxxDownloaderMiddleware() 
	def process_request(self, request, spider):
	    # 头部
	    # 语法:request.headers['User-Agent'] = '字符串形式的头部'
	    request.headers['User-Agent'] = random.choice(self.user_agent)
	    # 代理 ip
	    # 语法 request.meta['proxy'] = 'http://ip地址:端口号'
	    # 如:request.meta['proxy'] = 'https://171.41.80.238:9999'
	    return None

注意:需要在 settings.py 内打开 下载器中间件
DOWNLOADER_MIDDLEWARES = {}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

7.运行代码,有两种方式

1)在命令行下运行

进入项目文件夹下,运行 scrapy crawl 爬虫文件名

2)在项目文件夹下 新建一个文件 :
如:main.py,与spiders 文件夹同层级

固定结构:

from scrapy import cmdline
cmdline.execute('scrapy crawl 爬虫文件名'.split())

  • 1
  • 2

运行 main.py

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...