Scrapy简介
Scrapy是快速的高级Web爬网和Web爬网框架,可用于各种有用的应用,例如数据挖掘,信息处理或自动化测试等广泛用途。
Scrapy最初是为Web抓取而设计的,它也可以用于使用API或用作通用Web搜寻器来提取数据。
详情请参考官方文档:Scrapy 2.4文档
源代码下载
支持的Python版本
Scrapy需要使用Python 3.6+,或者CPython或PyPy 7.2.0+
要使用安装Scrapy conda,请运行:
conda install -c conda-forge scrapy
可以使用pip从PyPI安装Scrapy及其依赖项:
pip install Scrapy
建立项目
在开始抓取之前,必须建设一个新的Scrapy项目。
输入要存储代码并运行的目录:
D:
cd mySpiders
#scrapy startproject 项目名称
scrapy startproject spiderQiubai
这将创建一个spiderQiuba,目录机构如下:
spiderQiubai/
scrapy.cfg # deploy configuration file
spiderQiubai/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
新建第一只蜘蛛
#cd project_name(进入项目目录)
#scrapy genspider 应用名称 爬取网页的起始url
cd spiderQiubai
scrapy genspider qiubai https://www.qiushibaike.com
执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件,文件源码如下:
# -*- coding: utf-8 -*-
import scrapy
class QiubaiSpider(scrapy.Spider):
#应用名称
name = 'qiubai'
#允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
allowed_domains = ['www.qiushibaike.com']
#起始爬取的url
start_urls = ['https://www.qiushibaike.com']
def parse(self, response):
pass
设置修改settings.py配置文件相关配置:
添加或修改信息如下
#USER_AGENT = 'spiderQiubai (+http://www.yourdomain.com)'
#伪装请求载体身份
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
#开启管道
ITEM_PIPELINES = {
#300表示为优先级,值越小优先级越高
'spiderQiubai.pipelines.SpiderqiubaiPipeline': 300,
}
#是否遵守robots协议
ROBOTSTXT_OBEY = False
# Disable cookies (enabled by default)
COOKIES_ENABLED = False
设置修改item.py配置文件相关配置:
添加或修改信息如下
class SpiderqiubaiItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#存储作者
author = scrapy.Field()
#存储段子内容
content = scrapy.Field()
设置修改pipelines.py配置文件相关配置:
添加或修改信息如下
class SpiderqiubaiPipeline:
#构造方法
def __init__(self):
#定义一个文件描述符属性
self.fp = None
#下列都是在重写父类的方法:
#开始爬虫时,执行一次
def open_spider(self,spider):
print('爬虫开始')
self.fp = open('./data.txt', 'w',encoding='utf-8')
#因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。
def process_item(self, item, spider):
#将爬虫程序提交的item进行持久化存储
self.fp.write(item['author'] + ':' + item['content'] + '\n')
return item
#结束爬虫时,执行一次
def close_spider(self,spider):
self.fp.close()
print('爬虫结束')
设置修改qiubai.py配置文件相关配置:
添加或修改信息如下
# -*- coding: utf-8 -*-
import scrapy
from spiderQiubai.items import SpiderqiubaiItem
class QiubaiSpider(scrapy.Spider):
#应用名称
name = 'qiubai'
#允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
allowed_domains = ['www.qiushibaike.com']
#起始爬取的url
start_urls = ['https://www.qiushibaike.com/text/']
#爬取多页
pageNum = 1 #起始页码
url = 'https://www.qiushibaike.com/text/page/%s/' #每页的url
#访问起始URL并获取结果后的回调函数
#该函数的response参数就是向起始的url发送请求后
#获取的响应对象.该函数返回值必须为可迭代对象或者NUll
def parse(self, response):
#xpath为response中的方法,可以将xpath表达式直接作用于该函数中
odiv = response.xpath('//*[@class="article block untagged mb15 typs_hot"]')
'''print(odiv)
ss=input('等待输入...')
if ss not in ('Y','y'):exit()'''
for div in odiv:
#xpath函数返回的为列表
#列表中存放的数据为Selector类型的数据
#解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。
author = div.xpath('.//div[@class="author clearfix"]/a[2]/h2/text()')[0].extract()
#过滤空行
author = author.strip('\n')
content=div.xpath('.//div[@class="content"]/span').xpath('string(.)')[0].extract()
'''print(content)
ss=input('等待输入...')
if ss not in ('Y','y'):exit()'''
#过滤空行
content = content.strip('\n')
#将解析到的数据封装至items对象中
item = SpiderqiubaiItem()
item['author'] = author
item['content'] = content
#提交item到管道文件(pipelines.py)
yield item
#爬取指定页数页码数据
#超过13页需要用户验证,这里只读取前13页数据
if self.pageNum <= 13:
self.pageNum += 1
url = format(self.url % self.pageNum)
print(url)
#递归爬取数据:callback参数的值为回调函数(将url请求后,得到的相应数据继续进行parse解析),递归调用parse函数
yield scrapy.Request(url=url,callback=self.parse)
运行我们的蜘蛛
请转到项目的顶级目录并运行:
cd ..
scrapy crawl qiubai