使用scrapy框架爬取名句,在这里只爬取的了名句和出处两个字段。具体解析如下:
items.py 用来存放爬虫爬取下来的数据模型,代码如下:
import scrapy
class QsbkItem(scrapy.Item):
content = scrapy.Field()
auth = scrapy.Field()
piplines.py 将items的模型存储到json格式的文件中,有两种方法JsonItemExporter和JsonLinesExporter
1.JsonItemExporter,这个是每次把数据添加到内存中,最后统一写入到磁盘中,好处是,存储的数据是一个满足json规则的数据,坏处是如果数据量比较大,会比较的耗费内存
2.JsonLinesItemExporter这个是每次调用export_item的时候就把这个数据存储到硬盘中,坏处是每一个字典是一行,整个文件是一个满足json格式的文件,好处是每次从处理数据的时候就直接存储到了硬盘中,这样不会对内存造成压力,数据比较安全
# 数据量多的时候写入,按行写入
from scrapy.exporters import JsonLinesItemExporter
class QsbkPipeline(object):
def __init__(self):
self.fp = open('mj.json', 'wb')
self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding="utf-8")
def open_spider(self, spider):
print("爬虫开始了、、、")
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
def close_spider(self, spider):
print("爬虫结束了、、、")
# 使用导出器
from scrapy.exporters import JsonItemExporter
# 适用于数据量较少
# 下面的方法是把所有的数据都存储在item中,然后在一次性写入
# 若数据较大则会比较耗费内存
class QsbkPipeline(object):
def __init__(self):
self.fp = open('mj.json', 'wb')
self.exporter = JsonItemExporter(self.fp, ensure_ascii=False, encoding="utf-8")
# 开始写入
self.exporter.start_exporting()
def open_spider(self, spider):
print("爬虫开始了、、、")
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
def close_spider(self, spider):
# 结束写入
self.exporter.finish_exporting()
print("爬虫结束了、、、")
以上方法可以二选一
settings.py 本爬虫的一些配置信息(比如请求头、多久发送一次请求、ip代理池)对settings.py文件的修改如下
# 项目名称
BOT_NAME = 'qsbk'
# 爬虫应用路径
SPIDER_MODULES = ['qsbk.spiders']
NEWSPIDER_MODULE = 'qsbk.spiders'
# 是否遵循reboot.txt协议 True遵循
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# 下载延迟
DOWNLOAD_DELAY = 2
# 设置请求头信息
# 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',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'
' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
gswspider.py文件,由于网站的限制,若不下载客户端的话最多只能爬取20页的内容,因此编写爬虫如下
# -*- coding: utf-8 -*-
import scrapy
from qsbk.items import QsbkItem
class GswspiderSpider(scrapy.Spider):
# 爬虫的名字
name = 'gswspider'
# 允许的域名
allowed_domains = ['gushiwen.org']
# 起始的url
start_urls = ['https://so.gushiwen.org/mingju/default.aspx?p=1&c=&t=']
domains = 'https://so.gushiwen.org'
def parse(self, response):
# 使用xpath解析网页
all_mjs = response.xpath('//div[@class="left"]//div[@class="sons"]//div[@class="cont"]')
print(len(all_mjs))
for mj in all_mjs:
# print(mj)
# 使用get()可以从对象转化为文本
# ma = {}
content = mj.xpath(".//a[1]/text()").get()
auth = mj.xpath(".//a[2]/text()").get()
# # 变成生成器
# yield ma
item = QsbkItem(content=content, auth=auth)
yield item
next_url = response.xpath("//*[@id='FromPage']/div/a[1]/@href").get()
print("***********************")
print(next_url)
'''
//*[@id="FromPage"]/div/a[1]
'''
print("***********************")
if not next_url:
return
else:
p = next_url.split("?")[1].split("&")[0]
if p == "p=21":
return
else:
yield scrapy.Request(self.domains + next_url, callback=self.parse)
爬虫初学者,若有错误请在评论区指出或者私信我