- response是一个
<class 'scrapy.http.response.html.HtmlResponse'>
对象,可以执行‘xpath’和‘css语法来提取元素’ - 提取出来的数据是一个‘SelectorList’或者是一个‘Selector’对象,如果想要获取其中的字符串,那么应该执行getall或者get方法
- getall方法:获取selector中的所有文本,返回的是一个列表
- get方法:获取的是selector中的第一个文本,返回的是一个str类型
- 如果数据解析回来,要传给pipline处理,那么可以使用yiled来返回,或者是收集所有的items,最后统一使用items返回
- item:建议在item.py中定义好模型,以后就不要使用字典
- pipline:这个是专门用来保存数据的,其中三个方法经常用到。
open_spider(self,spider):当爬虫被打开的时候执行
process_item(self,item_spider):当爬虫有item传过来的时候被调用
close_spider(self,spider):当爬虫关闭的时候会被调用
要激活pipline,应在settings.py中,ITEM_PIPELINES = { 'qsbk.pipelines.QsbkPipeline': 300, }
JsonLinesItemExporter和JsonItemExporter:
保存json数据的时候,可以使用这两个类,让操作变的更简单
- JsonItemExporter:这个是每次把数据添加到内存中,最后统一写的磁盘中,好处是:存储的是数据是一个满足json规则的数据,坏处是如果数据量比较大则耗费时间比较长。
- JsonLinesItemExporter:这个是每次调用‘export_item’的时候就把这个item存储到磁盘中,坏处是每一个字典是一行,整个文件不是一个满足json格式的文件,好吃是每次处理数据的时候就直接存储到了硬盘中,这样不会耗内存,数据也比较安全。
糗事百科爬虫全过程
- 将settings里面的ROBOTSTXT_OBEY =True改成False
- 加入请求头:
DEFAULT_REQUEST_HEADERS = {
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8’,
‘Accept-Language’: ‘en’,
“User-Agent”: “Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36”
}- DOWNLOAD_DELAY = 1
- ITEM_PIPELINES = {
‘qsbk.pipelines.QsbkPipeline’: 300,
}
#利用终端来运行比较麻烦
from scrapy import cmdline
cmdline.execute("scrapy crawl qsbk_spider".split())
qsbk_spider.py
# -*- coding: utf-8 -*-
import scrapy
from qsbk.items import QsbkItem
class QsbkSpiderSpider(scrapy.Spider):
name = 'qsbk_spider'
#允许的域名,限制爬虫的范围,不会到处乱跑
allowed_domains = ['qiushibaike.com']
#开始的url,是一个列表,可以传递多个
start_urls = ['https://www.qiushibaike.com/text/page/1/']
def parse(self, response):
#Selevtorlist
divs= response.xpath("//div[@id='content-left']/div")
for div in divs:
author=div.xpath(".//h2/text()").get().strip()
content=div.xpath(".//