代码简单
前言
使用方式: CrawlSpider类:定义了一些规则来做跟进爬取,从爬取的页面中获取链接并且进行爬虫 scrapy genspider -t crawl 爬虫名 爬虫域名
一、解析目标页数据,一般很少用
如果要获取start_url的数据,需要重写parse_start_url方法
# 如果使用crawlspider想要解析列表页的数据
def parse_start_url(self, response, **kwargs):
# lis = response.xpath('//ul/li')
# for li in lis:
# print(li.xpath('./span/text()').get())
pass
# 解析方法 请求的是详情页的url,所以解析方法解析的是详情页的数据
二、解析详情页数据
rules
规则属性=元组 元组中包含的是多个Rule对象 ,代表规则,规则是根据链接提取器定义的正则来匹配对应的url 匹配成功之后自动发起请求,请求成功进入callback指定的回调方法中 follow参数代表是否继续跟踪 比如:当匹配到详情页url请求之后,如果为True代表从详情页中继续根据规则进行提取 如果为False代表不继续了,进入详情页请求完毕之后就结束了
代码如下(示例):
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
# 属于Spider类的孙子类,属于CrawlSpider的子类
class XjSpider(CrawlSpider):
name = "xj"
# allowed_domains = ["xj.com"]
start_urls = ["https://www.xjie.edu.cn/tzgg1.htm"]
# LinkExtractor:链接提取器、
# 提取列表页对应的所有详情页url
#info/1061/\d+.htm
# 规则属性=元组
# 元组中包含的是多个Rule对象 ,代表规则,规则是根据链接提取器定义的正则来匹配对应的url
# 匹配成功之后自动发起请求,请求成功进入callback指定的回调方法中
# follow参数代表是否继续跟踪
# 比如:当匹配到详情页url请求之后,如果为True代表从详情页中继续根据规则进行提取
# 如果为False代表不继续了,进入详情页请求完毕之后就结束了
rules = (
# 详情页
Rule(LinkExtractor(allow=r"info/1061/\d+.htm"), callback="parse_item", follow=False),
# 做分页
Rule(LinkExtractor(allow=r"tzgg1/\d+.htm"), follow=True),)
# 如果使用crawlspider想要解析列表页的数据
def parse_start_url(self, response, **kwargs):
# lis = response.xpath('//ul/li')
# for li in lis:
# print(li.xpath('./span/text()').get())
pass
# 解析方法 请求的是详情页的url,所以解析方法解析的是详情页的数据
num = 1
def parse_item(self, response):
# print(response.text)
print(self.num,response.xpath('//h3/text()').get(),response.url)
item = {}
#item["domain_id"] = response.xpath('//input[@id="sid"]/@value').get()
#item["name"] = response.xpath('//div[@id="name"]').get()
#item["description"] = response.xpath('//div[@id="description"]').get()
self.num+=1
return item