参考https://www.runoob.com/w3cnote/scrapy-detail.html
(主要参考这位大神的)https://blog.csdn.net/ck784101777/article/details/104468780
先强行入门,然后再分析
其他的文章都是爬 图片 爬电影列表,
但我现在在公司,网络环境是受到监控的,所以还是悠着点,爬一些常用的网站例如CSDN
文章中出现的案例就是爬 https://blog.csdn.net/ck784101777 我参考这位大神的所有文章列表
- 安装 scrapy模块
- 创建项目
进入指定目录运行 scrapy startproject 项目名
例如 scrapy startproject csdnSpider
会生成以下文件:
scrapy.cfg: 项目的配置文件
csdnSpider/: 该项目的python模块。之后您将在此加入代码。
csdnSpider/items.py: 项目中的item文件.
csdnSpider/pipelines.py: 项目中的pipelines(管道)文件.
csdnSpider/settings.py: 项目的设置文件.
csdnSpider/spiders/: 放置spider(爬虫)代码的目录. - 定义items:
作用: 用来保存爬取到的数据
将 csdnSpider/items.py 文件内容改为
import scrapy
class CsdnItem(scrapy.Item):
name = scrapy.Field()
url = scrapy.Field()
content = scrapy.Field()
pass
- 编写爬虫
在csdnSpider/spiders/目录下创建文件 如 jjhSpider(就是大神的名字)
import scrapy
from ..items import CsdnItem
class JJHSpider(scrapy.Spider):
# 爬虫名字 必须唯一
name = 'csdn'
# 爬取范围,规定爬虫只爬取这个域名下的网页
allowed_domains = ['csdn.net']
# 爬虫爬取数据起始的地方 (元组 或者列表)
start_urls = ('https://blog.csdn.net/ck784101777/article/list/1',)
# 这里设置的爬取次数
offset = 1
#解析方法
def parse(self, response):
# 保存获取到页面信息
# open('csdn.html', 'a', encoding='utf-8', errors='ignore').write(str(response.body, 'utf-8'))
items = CsdnItem()
# 从 response 中获取指定的内容
lists = response.xpath('//div[@class="article-list"]/div[@class="article-item-box csdn-tracking-statistics"]')
# 提取内容
for i in lists:
name = i.xpath('./h4/a/text()').extract()
url = i.xpath('./h4/a/@href').get()
content = i.xpath('./p[@class ="content"]/a/text()').extract()
items['name'] = name
items['url'] = url
items['content'] = content
yield items
# 回调函数 提取下一页 大神的文章共6页
if self.offset < 6:
self.offset += 1
url = 'https://blog.csdn.net/ck784101777/article/list/{}'.format(str(self.offset))
yield scrapy.Request(url=url, callback=self.parse)
-
修改setting 可以参照大神的修改 (不修改也可以的,我就怕被监控到,以后不让我访问了) 我只修改了一项
DOWNLOAD_DELAY = 1 -
.写个开始方法 或者在输入指令(项目路径下)例如 scrapy crawl csdn -o csdn.xml 我在
csdnSpider目录下写
from scrapy import cmdline
if __name__ == '__main__':
# -o csdn.xml 是指将爬取内容保存到 csdn.xml 中
cmdline.execute('scrapy crawl csdn -o csdn.xml'.split())
然后开始运行
就会生成一个 csdn.xml 文件 提取的内容就在里面
解析:
-
Scrapy 核心包含
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件): 你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
Scheduler Middewares(调度中间件): -
Scrapy运行大概流程:
1.程序员在Spiders里定义爬虫的起始URL。
2.ScrapyEngine把Spider中的起始URL,推送到Scheduler。
3.Scheduler调度URL通过Downloader去互联网下载HTML内容。
4.Downloader下载HTML内容并返回给Spiders(回调函数)。
5.Spiders调用 Item Pipeline把爬到的内容保存的数据库/文件,或者继续循环流程1-5。
我感觉最难的是从XPath 开始提取数据
可以参考: https://www.runoob.com/xpath/xpath-tutorial.html
从Chrome一键获取 xpath 地址的方法(右键->检查->copy->copy xpath)
这个我没成功
尝试了好几次 所以就成了这个样子
‘//div[@class=“article-list”]/div[@class=“article-item-box csdn-tracking-statistics”]’
这个的意思是 选取 所有class= “article-list” 的div标签下class="article-item-box csdn-tracking-statistics"的div标签下
剩下三个:
<h4>
<a href ="https://blog.csdn.net/ck784101777/article/details/104468780">
"网络爬虫"
</a >
</h4>
<p class ="content">
<a>
"这里是内容"
</a >
</p >
i.xpath(’./h4/a/text()’).extract() :获取到的是 “网络爬虫”
i.xpath(’./h4/a/@href’).get() : 获取到的是: https://blog.csdn.net/ck784101777/article/details/104468780
i.xpath(’./p[@class =“content”]/a/text()’).extract() : 获取到的是: “这里是内容”
一些XPath语法
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
… 选取当前节点的父节点。
@ 选取属性。