正文
import scrapy
from scrapy.http import HtmlResponse
from zj_scrapy.items import ZjScrapyItem
class SjqqSpider(scrapy.Spider):
name = 'sjqq'
allowed_domains = ['sj.qq.com']
start_urls = ['https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114']
def parse(self, response:HtmlResponse):
name_list = response.xpath('/html/body/div[3]/div[2]/ul/li')
print("=============",response.headers)
for each in name_list:
item = ZjScrapyItem()
name = each.xpath('./div/div/a[1]/text()').extract()
item['name'] = name[0]
yield item
pass
pipeline文件一般用于对处理好的爬虫结果数据做处理,可以入到数据库中,也可以生成到指定的文件中,process_item 方法就是对数据做处理的。
另外pipeline 还包含了__init__和close_spider 两个方法。
__init__ 用于做初始化处理。
close_spider 用于执行结束时的操作处理。
比如数据写入数据库或者文件后,对数据库做链接关闭或者文件流做关闭操作等。
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
class ZjScrapyPipeline(object):
def process_item(self, item, spider):
print("+++++++++++++++++++",item['name'])
print("-------------------",spider.cc)
return item
setting文件中存放的是爬虫的配置,常用的配置一般可以包括
ITEM_PIPELINES = {
'zj_scrapy.pipelines.ZjScrapyPipeline': 300,
}
这里的300代表了一个优先级,数值范围一般在0-1000,这个数值确定了运行的顺序,数字越小,优先级越高。
2)、字符集配置,可以通过FEED_EXPORT_ENCODING指定字符集:
FEED_EXPORT_ENCODING = 'utf-8'
3)、CONCURRENT_REQUESTS配置Scrapy执行的最大并发请求数
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32
4)配置请求的header,可以通过DEFAULT_REQUEST_HEADERS来进行配置
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
在上面的都做完后,可以通过执行命令行scrapy crawl sjqq -o items.csv 来在本地运行爬虫,sjqq 就是前面指定的爬虫名,-o items.csv 表示生成一个csv文件。
运行完成后,可以看到爬取的内容已经写到了指定的文件中。
在运行时,可以通过-a 指定自定义的参数,比如scrapy crawl sjqq -o items.csv -a cc=scrapttest 在这条执行命令中,我们指定了一个cc参数等于scrapttest,在Pipeline 中,我们可以通过代码获取这个参数
class ZjScrapyPipeline(object):
def process_item(self, item, spider):
print("+++++++++++++++++++",item['name'])