本次以下厨房为例
创建(继承自CrawlSpider类)
scrapy genspider -t crawl xcfCrawlSpider xiachufang.com
打开爬虫文件
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
#通用爬虫提取到的连接会构建一个Link对象
from scrapy.link import Link
from xiachufang.items import XiachufangCaiPuItem,XiachufangTagItem,XiachufangUserInfoItem
class XcfcrawlspiderSpider(CrawlSpider):
#爬虫名称
name = 'xcfCrawlSpider'
#设置允许爬取的域
allowed_domains = ['xiachufang.com']
#设置起始的url
# start_urls = ['http://www.xiachufang.com/category/']
redis_key = 'xcfCrawlSpider:start_urls'
# LinkExtractor中的相关参数
"""
allow = (), :设置正则规则,符合正则表达式的所有url都会被提取,
如果为空,则提取全部的url连接
restrict_xpaths = ():使用xpath语法,定位到指定的标签(节点)下,
在该标签(节点)下获取我们的url连接
restrict_css = ()
"""
rules = (
#分类列表地址
# http://www.xiachufang.com/category/40073/
Rule(
LinkExtractor(allow=r'.*?/category/\d+/'),
follow=True,
process_links='check_category_url'
),
# 菜单详情地址,
# http://www.xiachufang.com/recipe/1055105/
Rule(
LinkExtractor(
allow=r'.*?/recipe/\d+/',
),
callback='parse_caipu_detail',
follow=True,
),
#用户信息接口
#http://www.xiachufang.com/cook/118870772/
Rule(
LinkExtractor(
allow=r'.*?/cook/\d+/'
),
callback='parse_userinfo_detail',
follow=True,
)
)
def parse_start_url(self, response):
"""
如果想要对起始url的响应结果做处理的话,就需要回调这个方法
"""
self.parse_item
def parse_item(self, response):
pass
def check_category_url(self,links):
"""
可以在此方法做对规则提取的url构建成的的link对象做过滤处理
当正则无法匹配到完整的url,我们也可以通过这个方法对url进行拼接
如:某些网页需要拼接锚点可以通过调用这个方法
:param links:
:return:
"""
print('===================',links,'===================')
return links
rule规则常用的参数
LinkExtractor: 提取连接的规则(正则)
allow = ():设置允许提取的目标url
deny=():设置不允许提取的目标url(优先级比allow高)
restrict_xpaths=(): 根据xpath语法,定位到某一标签提取目标url
restrict_css=(): 根据css语法,定位到某一标签提取目标url
callback=None:设置回调函数
follow=None:是否设置跟进(下一页满足条件跟进)
process_links:可设置回调函数,对request对象拦截(标签下无法直接获取的url,拼接url锚点)
注意
- 通用爬虫不能用parse方法