安装scrapy
pip install scrapy
cmd执行scrapy和scrapy bench验证安装
原理
engine是引擎,核心大脑
spiders写爬虫逻辑,提取数据(item)或者请求,请求交给调度器,数据交给管道
scheduler是调度器(网址的优先队列,可以去重)
downloader是下载网页用的
item pipelines用来处理爬下来的item、保存持久化数据
ab间的中间件:处理ab两者间请求和响应
engine -> downloader 是下载器中间件(downloader middlewares)
engine -> spiders是爬虫中间件(spider middlewares)
engine -> scheduler是调度中间件(scheduler middlewares)
实战
【新建项目-创建爬虫-分析页面-运行爬虫】
爬代理网站ip https://www.xicidaili.com/nn/
- cmd执行 【scrapy startproject xiciSpider】 (项目名)
- 【cd xiciSpider】进入项目路径(含.cfg文件)
- 创建爬虫文件【scrapy genspider xicidaili xicidaili.com】 (爬虫名,网站域名)其中爬虫名和项目名不能一样,网站域名用来限制可以爬取的网站,防止爬到别的网站。可以后面改。
- 修改settings.py ROBOTSTXT_OBEY = False
- 分析网站(提取数据:正则表达式、Xpath(最佳)、css)[response.xpath]
- 运行爬虫【scrapy crawl xicidaili】
- 如果爬不了,就加请求头 改settings
查看scrapy一共几个类:
scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed
安装chrome扩展xpath helper
比如//tr/td[2]/text() 是提取所有tr标签下第2个td标签的文本
# -*- coding: utf-8 -*-
import scrapy
# 创建爬虫类,继承自scrapy.Spider --> 爬虫最基础的类,basic crawl csvfeed xmlfeed都继承自这个类
class XicidailiSpider(scrapy.Spider):
name = 'xicidaili' # 必须唯一
allowed_domains = ['xicidaili.com'] # 允许采集的域名
start_urls = ['https://www.xicidaili.com/nn/'] # 第一次开始采集的网站
# start_urls = [f'https://www.xicidaili.com/nn/{page}' for page in range(1, 4058)] # url list
# 解析response响应数据(网页源码) 提取数据或网址
def parse(self, response):
# 提取ip
selectors = response.xpath('//tr') # 选择所有的tr标签
# 循环遍历tr标签下的td标签
for selector in selectors:
ip = selector.xpath('./td[2]/text()').get() # 返回list,.get获取一个,.getall获取多个,也可用.extract_first()
port = selector.xpath('./td[3]/text()').get() # . 代表当前selector继续选择
print(ip, port)
items = {
'ip': ip,
'port': port
}
yield items # 运行时用scrapy crawl xicidaili -o ip.json
# 翻页
next_page = response.xpath('//*[@class="next_page"]/@href').get()
if next_page:
# 拼接网址
next_url = response.urljoin(next_page)
print(next_url)
# Request发出请求,callback 是将请求得到的响应扔给自己
yield scrapy.Request(next_url, callback=self.parse) # yield是生成器