采集目标:采集西祠网的IP代理 包括 IP PORT
1. 新建项目 scrapy startproject xicidailiSpider # scrapy 新建项目 项目名 2. 创建爬虫 scrapy genspider xicidaili xicidaili.com # scrapy 产生爬虫 爬虫名字 网站域名 # 注意:爬虫名字一定不能与项目名字一致!可以看到,在项目的spiders下得到了一个爬虫文件
解释爬虫文件
import scrapy # 导入scrapy # 创建爬虫类 并且继承自scrapy.Spider --> 爬虫最基础的类 # 另外几个类都是继承自这个类 class XicidailiSpider(scrapy.Spider): #爬虫名字 --> 必须唯一 name = 'xicidaili' # 允许采集的域名 allowed_domains = ['xicidaili.com'] # 开始采集的网站 start_urls = ['http://xicidaili.com/'] # 解析响应数据 提取数据 或者网址等 response就是网页源码 def parse(self, response): pass 3. 分析网址
提取数据
正则表达式(基础 必回 难掌握)
XPath --> 从HTML中国提取数据语法
CSS --> 从HTML中国提取数据语法
response.xpath("xpath语法").get()
get() 是得到一个元素
getall() 是多个元素
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,3685)] def parse(self, response): # 提取数据 # response.xpath("//tr/td[2]/text()") selectors = response.xpath("//tr") for selector in selectors: ip = selector.xpath("./td[2]/text()").get() # . 在当前节点下继续选择 port = selector.xpath("./td[3]/text()").get() # ip = selector.xpath("./td[2]/text()").extract_first() # 与get等价 # port = selector.xpath("./td[3]/text()").extract_first() print(ip,port) 4. 运行爬虫 scrapy crawl 爬虫名字 # 翻页操作 next_page = response.xpath('//a[@class="next_page"]/@href').get() if next_page: print(next_page) # 拼接网址 next_url = response.urljoin(next_page) yield scrapy.Request(next_url,callback=self.parse) # yield 生成器 # Request() 发送请求 类似requests.get() # callback 是回调函数 将发出去的请求得到的响应还交给自己(self.parse)处理 # 注意:回调函数不要写() 只写方法名字