六、糗事百科之爬取多个页面
Link.
作者:Irain
QQ联系方式:2573396010
微信:18802080892
1 主要文件内容:
1.2 糗事百科spider.py示例代码
# -*- coding: utf-8 -*-
import scrapy
from choushibaike.items import ChoushibaikeItem
class SpiderChoushibaikeSpider(scrapy.Spider):
name = 'spider_csbk' # 爬虫名称
allowed_domains = ['qiushibaike.com'] # 限定爬取该域名下的内容
start_urls = ['https://www.qiushibaike.com/text/page/1/'] # 访问请求开始
base_domain = "https://www.qiushibaike.com" # 补充下一页的域名
def parse(self, response):
print("$" * 20)
duanzidivs = response.xpath("//div[@class='col1 old-style-col1']/div") # SelectorList
for duanzidiv in duanzidivs: # Selector
author = duanzidiv.xpath(".//h2/text()").get().strip() # 爬取段子的作者
content = duanzidiv.xpath(".//div[@class='content']//text()").getall() # 爬取一个段子所有内容
content = "".join(content).strip() # 转换为json形式,去掉字符串两边的空格
item = ChoushibaikeItem(author= author, content= content) # 固定传参数量、以类的形式传参(不是字典)
yield item
next_url = response.xpath("//*[@id='content']/div/div[2]/ul/li[last()]/a/@href").get() # 获取下一页url
if not next_url: # 判断是否有下一页
return # 没有下一页返回为空
else:
yield scrapy.Request(self.base_domain + next_url, callback=self.parse)
# 有下一页,继续爬取。类似递归思路,直到没有为止。
print("$" * 20)
1.2 item.py 定义实例变量
import scrapy
class ChoushibaikeItem(scrapy.Item): # Item中定义实例变量
# define the fields for your item here like:
# name = scrapy.Field()
author = scrapy.Field()
content = scrapy.Field()
1.3 pipelines.py
from scrapy.exporters import JsonLinesItemExporter
# JsonLinesItemExporter:一个字典一行,不满足json格式的;数据都直接存到磁盘文件中,内存占用少.
class ChoushibaikePipeline(object):
def __init__(self):
self.fp = open("duanzi.json","wb") # 管道类初始化,以wb二进制打开文件,二进制没有编码形式
# ensure_ascii=False:以中文字符保存
self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
def open_spider(selfs,spider): # 爬虫开始前,执行
print('开始了')
def process_item(self, item, spider): # 爬虫开始过程,执行
self.exporter.export_item(item) # 爬虫获取到的每项item数据的处理方法
return item
def close_spider(self,spider): # 爬虫结束后,执行
self.fp.close() # 关闭文件
print("over")
1.4 settings.py设置
DOWNLOAD_DELAY = 1 # 下载前等待1秒
2 结果展示
3 报错:[scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to ‘www.qiushibaike.com’: <GET https://www.qiushibaike.com/text/page/2/>
解决方法:
allowed_domains = ['qiushibaike.com'] # 限定爬取该域名下的内容
日期:2020年4月16日