安装scrapy框架: pip3 install scrapy
爬虫流程:
创建scrapy爬虫项目的步骤:
1. 创建一个scrapy项目: scrapy startproject 项目名 # 在Python命令行终端中执行
2. 生成一个爬虫:先cd到项目目录中 ----> scrapy genspider 爬虫名 baidu.com # (url域名可以限制爬虫爬取的范围)
3. 提取数据: 完善spiders/爬虫名.py,使用xpath等方法
4. 保存数据: pipelines.py中保存数据
5. 启动爬虫项目: cd到项目目录中 ----> scrapy crawl 爬虫名 # 在Python命令行终端中执行
项目名/spiders/爬虫名.py(爬虫,xpath等提取数据):
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo' # 爬虫名
allowed_domains = ['baidu.com'] # 允许爬取的范围
start_urls = ['http://www.baidu.com/'] # 最开始请求的url地址
# 函数名固定
def parse(self, response):
# 处理start_url地址对应的响应
# ret1 = response.xpath("//div[@class='tea_con']//h30/text()") # 返回 类似列表类型 [<Selector xpath="..." data="文本1">]
# ret1 = response.xpath("//div[@class='tea_con']//h30/text()").extract() # extract提取出数据。 ["文本1","文本2"]
# print(ret1) # ["文本1","文本2"]
# 分组
li_list = response.xpath("//div[@class='tea_con']//li")
for li in li_list:
item = {}
item["name"] = li.xpath(".//h3/text()").extract_first() # extract()[0] 没有数据会报错。extract_first()没有数据返回None。
item["title"] = li.xpath(".//h4/text()").extract_first()
# print(item)
# yield后面返回的必须是 Request, BaseItem, dict or None 类型。 不能返回类似列表的类型。
yield item # 会将item数据传递给 pipelines.py处理。 也可以返回Request对象,表示发送下一个url请求。
# yield会将函数变成生成器,避免占用大量内存。
项目名/pipelines.py(管道,保存数据):
# -*- coding: utf-8 -*-
# 需要在setting.py文件中配置ITEM_PIPELINES项
class MyspiderPipeline(object):
# 函数名固定
def process_item(self, item, spider):
print(item) # item是爬虫提取出来的数据。 (或者是上一个pipelines类return返回的数据)
return item # 如果没有return,后面的pipelines类就不会收到item数据
class MyspiderPipeline1(object):
def process_item(self, item, spider):
print(item)
return item
项目名/settings.py(配置文件,配置pipelines管道):
# 。。。
LOG_LEVEL = "WARNING" # 设置日志等级。 默认debug级别
LOG_FILE = "./log.log" # 设置日志保存位置
USER_AGENT = 'xxx' # 设置请求头,模拟浏览器
# 服从 robots.txt 协议
ROBOTSTXT_OBEY = True
# 开启pipelines。 配置pipelines
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 300, # 配置pipelines中的类 距离scrapy引擎的距离(权重)。
'myspider.pipelines.MyspiderPipeline1': 301, # 数据会先经过300的pipelines类,再经过301的类。
}
# 。。。
项目目录结构: