scrapy入门
Scrapy工作流程
名称 | 作用 |
---|---|
Scrapy engine(引擎) | 总指挥:负责数据和信号的在不同模块间的传递 |
Scheduler(调度器) | 一个队列,存放引擎发过来的request请求 |
Downloader(下载器) | 下载把引擎发过来的requests请求,并返回给引擎 |
Spider(爬虫) | 处理引擎发来的response,提取数据,提取url,并交给引擎 |
Item Pipline(管道) | 处理引擎传过来的数据,比如存储 |
Downloader Middlewares(下载中间件) | 可以自定义的下载扩展,比如设置代理 |
Spider Middlewares(中间件) | 可以自定义requests请求和进行response过滤 |
创建Scrapy项目
在开始爬取之前,您必须创建一个新的Scrapy项目:
- 在终端输入命令:
scrapy startproject mySpider
(后面的mySpider是项目名称,可以任意取) - 跟着提示输入
图片里面的第三步中的 gsw 爬虫文件的名字,gushiwen.cn是爬取的范围(域名)。
启动爬虫
第一种方式:在终端进入项目的根目录,执行下列命令启动spider: scrapy crawl xxx
第二种方式:在项目的根目录下面创建一个py文件,在里面输入下面类容,并且在这个文件我们能直接运行。
from scrapy import cmdline
cmdline.execute(['scrapy', 'crawl', 'xxx'])
settings文件
对settings.py 文件的一些配置项进行简单介绍:
-
是否遵守robots协议, 一般改为False
ROBOTSTXT_OBEY = True
-
并发量,默认为16
# Configure maximum concurrent requests performed by Scrapy (default: 16) # CONCURRENT_REQUESTS = 32
-
下载延迟
# DOWNLOAD_DELAY = 3
-
请求报头
# Override the default request headers: #DEFAULT_REQUEST_HEADERS = { # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # 'Accept-Language': 'en', #}
-
爬虫中间件
#SPIDER_MIDDLEWARES = { # 'gu_shi_wen.middlewares.GuShiWenSpiderMiddleware': 543, #}
-
下载中间件
#DOWNLOADER_MIDDLEWARES = { # 'gu_shi_wen.middlewares.GuShiWenDownloaderMiddleware': 543, #}
-
管道
#ITEM_PIPELINES = { # 'gu_shi_wen.pipelines.GuShiWenPipeline': 300, #}
我们也可以在settings.py文件里面手动添加一些其它的配置项:
设置日志等级:LOG_LEVEL = 'WARNING'
解析数据
在scrapy的爬虫文件里面,我们可以使用xpath来进行数据解析,它会返回一个Selector对象。如果我们要获取则需要使用下面的方法。
获取一条数据
extract_first()
,或者get()
获取多条数据
extract()
,或者getall()
例:
class DbSpider(scrapy.Spider):
name = 'db'
allowed_domains = ['douban.com']
start_urls = ['https://music.douban.com/chart']
def parse(self, response, **kwargs):
# print(response.text)
li_tags = response.xpath('//ul[@class="col5"]/li')
# print(li_tags, type(li_tags))
for li_tag in li_tags:
song_names = li_tag.xpath('./div[@class="intro"]/h3/a/text()').extract_first()
print(song_names)
song_name = li_tag.xpath('./div[@class="intro"]/h3/a/text()')
print(song_name)
break
运行结果:
City light(original version)
[<Selector xpath='./div[@class="intro"]/h3/a/text()' data='City light(original version)'>]
scrapy.Request
scrapy.Request(url, callback=None, method='GET', headers=None, body=None,cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, flags=None)
常用参数为:
callback:指定传入的URL交给那个解析函数去处理
meta:实现不同的解析函数中传递数据,meta默认会携带部分信息,比如下载延迟,请求深度
dont_filter:让scrapy的去重不会过滤当前URL,scrapy默认有URL去重功能,对需要重复请求的URL有重要用途
翻页处理
在爬虫文件里面我们可能需要爬取很多页,这就需要我们进行翻页处理;
1、找到翻页的url,并找出翻页url的规律
2、使用yield scrapy.Request()
,在里面的url参数传你要翻页的url
import scrapy
from gu_shi_wen.items import GuShiWenItem
class GswSpider(scrapy.Spider):</