——在上文,我们用Scrapy爬取糗事百科段子的首页,接下来我们来完善之前的代码,爬取多个页面,并保存到本地csv、Excel文件
-
项目回顾
上文的项目流程:
- settings.py:忽略robots协议、设置user-agent、关闭讨厌的日志生成
- qsbk.py:爬取糗事百科首页段子
- run.py:运行爬虫
- items.py:定义数据模型
- pipelines.py:保存为json数据
- settings.py:激活pipeline
scrapy项目流程:
1.建立scrapy项目和爬虫
打开Python编辑器,打开要存放项目的目录,在终端执行以下命令:
scrapy startproject myspider
cd myspider
scrapy genspider qsbk qiushibaike.com
2.设置文件 settings.py
BOT_NAME = 'myspider'
SPIDER_MODULES = ['myspider.spiders']
NEWSPIDER_MODULE = 'myspider.spiders'
LOG_LEVEL = 'WARN'
USER_AGENT = 'Mozilla/5.0'
ROBOTSTXT_OBEY = False
3.定义数据模型 items.py
import scrapy
class MyspiderItem(scrapy.Item):
content = scrapy.Field()
link = scrapy.Field()
4.运行爬虫代码 run.py
事先写好可以在编辑器运行爬虫的代码,而不是每次输入命令行,方便调试,方法是在项目目录下创建一个run.py文件(文件名随便),输入以下代码:
from scrapy import cmdline
cmdline.execute('scrapy crawl qsbk'.split())
5.编写爬虫代码 qsbk.py
以下是上文爬取糗事百科段子的首页的代码:
# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem
class QsbkSpider(scrapy.Spider):
name = 'qsbk'
allowed_domains = ['qiushibaike.com']
start_urls = ['https://www.qiushibaike.com/text/page/1/']
def parse(self, response):
articles = response.xpath('//div[@id="content-left"]/div')
for article in articles:
link = 'https://www.qiushibaike.com'+ article.xpath('./a/@href').get()
content = article.xpath('./a/div/span/text()').get().strip()
print(content,link)
接下来我们来分析糗事百科的段子页面,实现爬取多个页面
可以发现,下一页的链接在最后一个li标签里面,这里是部分链接,还要加上它的基本域名https://www.qiushibaike.com
代码实现:
# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem
class QsbkSpider(scrapy.Spider):
name = 'qsbk'
allowed_domains = ['qiushibaike.com']
start_urls = ['https://www.qiushibaike.com/text/page/1/']
# 在此处定义一个变量,基本域名
base_domain = 'https://www.qiushibaike.com'
def parse(self, response):
articles = response.xpath('//div[@id="content-left"]/div')
for article in articles:
link = 'https://www.qiushibaike.com'+ article.xpath('./a/@href').get()
content = article.xpath('./a/div/span/text()').get().strip()
items = MyspiderItem(content = content,link = link)
yield items
# 获取下一页的链接
next_url = response.xpath('//ul[@class="pagination"]/li[last()]/a/@href').get()
# 判断下一页是否存在,存在则提交Requests对象,返回Response对象再回调parse()函数
if not next_url:
return
else:
yield scrapy.Request(self.base_domain+next_url,callback=self.parse)
-
下载延迟和激活管道 settings.py
此时因为我们的爬取量大了,就要设置下载延迟,不要让它爬太快,以免把别人的服务器搞垮了
打开设置文件settings.py,将下载延迟设置为1秒,激活管道
BOT_NAME = 'myspider'
SPIDER_MODULES = ['myspider.spiders']
NEWSPIDER_MODULE = 'myspider.spiders'
LOG_LEVEL = 'WARNING'
USER_AGENT = 'Mozilla/5.0'
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 300,
}
-
存储文件 pipelins.py
1.保存为csv文件
import csv
class MyspiderPipeline(object):
def open_spider(self, spider):
print('爬虫开始了...')
self.file= open('duanzi.csv','w',newline='',encoding = 'utf-8-sig')
self.writer =csv.writer(self.file)
self.writer.writerow(['段子','链接'])
def process_item(self, item, spider):
self.writer.writerow([item['content'],item['link']])
return item
def close_spider(self, spider):
self.file.close()
print('爬虫结束了...')
2.保存为Excel表格
import openpyxl
class MyspiderPipeline(object):
def __init__(self):
print('爬虫开始了...')
self.wb = openpyxl.Workbook()
self.ws = self.wb.active
self.ws.append(['段子','链接'])
def process_item(self, item, spider):
self.ws.append([item['content'],item['link']])
return item
def close_spider(self, spider):
self.wb.save('./duanzi.xlsx')
self.wb.close()
print('爬虫结束了...')
>>>
阅读更多文章请点击以下链接:
python爬虫从入门到放弃之一:认识爬虫
python爬虫从入门到放弃之二:HTML基础
python爬虫从入门到放弃之三:爬虫的基本流程
python爬虫从入门到放弃之四:Requests库基础
python爬虫从入门到放弃之五:Requests库高级用法
python爬虫从入门到放弃之六:BeautifulSoup库
python爬虫从入门到放弃之七:正则表达式
python爬虫从入门到放弃之八:Xpath
python爬虫从入门到放弃之九:Json解析
python爬虫从入门到放弃之十:selenium库
python爬虫从入门到放弃之十一:定时发送邮件
python爬虫从入门到放弃之十二:多协程
python爬虫从入门到放弃之十三:Scrapy概念和流程
python爬虫从入门到放弃之十四:Scrapy入门使用
python爬虫从入门到放弃之十五:ScrapyScrapy爬取多个页面
python爬虫从入门到放弃之十六:Xpath简化
python爬虫从入门到放弃之十七:常见反爬手段
python爬虫已放弃,视频教程资源来领取