文章目录
一、Scrapy框架是什么?
- Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。
- Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。其吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等。(百度百科)
- 功能:
----高性能持久化存储
----异步数据下载
----高性能的数据解析操作
----分布式
二、windows系统环境搭配
1.先cmd命令行:
pip install whl
2.下载Twested.whl文件:
- 点这里下载whl文件,我的python是3.8版本,下载Twisted-20.3.0-cp38-cp38-win_amd64.whl,下载对应的即可.
- 命令行进入whl的下载目录: pip intall Twisted-20.3.0-cp38-cp38-win_amd64.whl
3.命令行:
pip intall pywin32
4.命令行:
pip install scrapy
安装完后,命令行:scrapy,若不报错则安装成功
三、工程的创建及基本操作
1.创建scrapy工程:
- 创建一个新的项目,再在其中创建一个目录《九、scrapy框架》
- 进入“终端”

- 进入当前文件目录:
scrapy startproject xxxPro
cd 路径(路径可以直接复制粘贴)
-指令:
scrapy startproject MyPro(工程名称随意)

目录中就会多一个scrapy工程文件:

- 进入工程目录:
cd MyPro

- 在spiders子目录中创建一个爬虫文件:
scrapy genspider spiderName www.xxx.com
(spiderName是文件名,www.xxx.com写随意,因为后面可以改)
比如文件名叫SpiderMan,访问百度:scrapy genspider spiderMan www.baidu.com


2.基本操作
- 先看我们创建的爬虫文件SpiderMan.py

1.这里面只有一个类,继承了scrapy.Spider类,类中有一个方法parse,有一个参数response
2.name是爬虫文件的名字
3.allowed_domains(允许访问的域名)是一个列表,里面最开始存的就是我们创建时写的www.baidu.com
4.start_urls是我们以后要发送请求的url
5.allowed_domains对start_urls进行限制,即在start_urls中的url,若allowed中没他的域名,则不能发送请求。但一般我们会把 allowed列表注释掉.
6.方法parse是解析数据的方法,response就是我们请求url后得到的响应数据,我们要在这个方法中对其进行解析.
- 测试运行爬虫文件:
先测试输出一下访问得到的response
在parse中: print(response)
进入settings.py文件,修改ROBOTSTXT_OBEY =True为False
终端指令:scrapy crawl SpiderMan(文件名)
结果输出许多东西,包括日志,错误,我们需要的信息等:
- 去除不需要的无用的数据,保留错误日志:
进入settings.py文件,在任意处添加:LOG_LEVEL=“ERROR”
结果只有我们需要的信息:
- UA伪装
在settings.py文件中任意位置添加:
USER_AGENT=‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55’
四、爬取糗事百科的段子及其作者名字
- 新建一个scrapy工程 QIushibaike
- 网址:https://www.qiushibaike.com/text/
- 我们需要写的是爬虫文件中的parse方法
- 查网页,找到目标标签:


很明显可以找到作者及段子的标签。下面用xpath定位提取文本内容:
class QiushiSpider(scrapy.Spider):
name = 'qiushi'
#allowed_domains = ['www.qiushibaike.com']
start_urls = ['https://www.qiushibaike.com/text/']
def parse(self, response):
#解析作者名称+段子内容
print('========================================================================')
i=1
#循环遍历每个div(即每个段子的标签)直到标签为空停止循环
while True:
#xpath返回的是一个列表,但是列表元素一定是Selector类型的对象
#extract可以将Selector对象中的data参数存储的字符串提取出来
#content是段子内容,这里我们不用实例化etree对象,直接用response.xpath即可
content=response.xpath(f'//div[@class="col1 old-style-col1"]/div[{i}]/a/div/span[1]/text()')
author=response.xpath(f'//div[@class="col1 old-style-col1"]/div[{i}]/div/a[2]/h2/text()').extract()
if not content:#若为空,则停止循环
break
else:
s=content.extract()
name=author[0].strip("\n")
#对输出的内容做一下调整,看起来更工整
print(f'用户【{name}】:')
print(''.join(s).lstrip('\n').rstrip('\n'))
i+=1

PS :若遇到输出的列表为空的情况:可能是Xpath错了,或者检查一下USER_AGENT是否写了(尽量写上述的)
代码如下(示例):
五、持久化存储之基于终端的持久化存储(未完待续)
六、持久化存储之基于管道的持久化存储(含面试题)(未完待续)
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

