安装
pip install scrapy
入门使用
1.创建一个scrapy项目
scrapy startproject 项目名
scrapy startproject myspider
2.生成一个爬虫
scrapy genspider 爬虫名 允许爬取的范围
允许爬取的范围:域名
例如:
https
://fanyi
.baidu
.com
/?aldtype
=16047
对于这个网站来说,允许爬取的范围就是 fanyi
.baidu
.com
3.提取数据
完善spider,使用xpath等方法
4.保存数据
在pipeline中保存数据
5.启动爬虫
scrapy crawl 爬虫名
scrapy入门
创建一个scrapy项目
创建一个爬虫
完善spider
使用pipeline
实例
使用scrapy框架爬取下面的网站 http://www.itcast.cn/channel/teacher.shtml#ajavaee
网站介绍
确定start_urls的地址 http://www.itcast.cn/channel/teacher.shtml#ajavaee 查看一下上面的这个url地址对应的响应中是否存在着我们想要的数据 选中页面,鼠标右键,查看网页源代码 我们可以看见,这个url地址对应的响应中确实是存在着我们想要的数据的 因而,我们选用这个url地址作为我们的start_urls地址
写xpath语句
代码预览
文件树
这个是最终的文件树
cmd
scrapy startproject Myspider
cd Myspider
scrapy genspider itcast itcast
.cn
scrapy crawl itcast
itcast.py
import scrapy
from ..items
import MyspiderItem
class ItcastSpider(scrapy
.Spider
):
name
= 'itcast'
allowed_domains
= ['itcast.cn']
start_urls
= ['http://www.itcast.cn/channel/teacher.shtml#ajavaee']
def parse(self
,response
):
"""
为什么我们可以对列表使用extract()方法?
这个得到的并不是列表,而是scrapy自己定义的一种与列表类似的类型
"""
li_list
=response
.xpath
('//div[@class="maincon"]/ul[@class="clears"]//li')
for li
in li_list
:
item
=MyspiderItem
()
item
["name"]=li
.xpath
('.//div[@class="main_bot"]/h2/text()').extract_first
()
item
["title"]=li
.xpath
('.//div[@class="main_bot"]/h2/span/text()').extract_first
()
"""
如果xpath书写错误或者是没有获取到数据的时候:
- .extract_first()
返回一个None值
- .extract()[0]
报错
"""
yield item
items.py
"""
我们可以在其中预先定义好我们要爬哪一些字段
我们可以在items.py文件中定义
"""
import scrapy
class MyspiderItem(scrapy
.Item
):
name
= scrapy
.Field
()
title
= scrapy
.Field
()
pipelines.py
"""
管道:数据的处理和保存
"""
import json
class MyspiderPipeline1:
def process_item(self
, item
, spider
):
print(item
)
self
.save_item
(dict(item
))
return item
def save_item(self
,item
):
"""实现存储方法"""
with open("temp.txt","a") as f
:
json
.dump
(item
,f
,ensure_ascii
=False,indent
=2)
class MyspiderPipeline2:
def process_item(self
, item
, spider
):
return item
settings.py
变动的地方
全部的代码
"""这是整个项目的设置的文件"""
BOT_NAME
= 'Myspider'
SPIDER_MODULES
= ['Myspider.spiders']
NEWSPIDER_MODULE
= 'Myspider.spiders'
LOG_LEVEL
= "WARN"
USER_AGENT
= 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
ROBOTSTXT_OBEY
= True
ITEM_PIPELINES
= {
'Myspider.pipelines.MyspiderPipeline1': 300,
}
思考
为什么我们需要给爬虫一个允许爬取的范围呢?
因为使用scrapy框架爬虫非常快,如果我们不加以限制,可能会爬取到别的网站上的信息