您的位置:首页 > 其它

scrapy框架之crawlspider

2019-06-04 14:47 274 查看

spider.py

# 项目名为wxapp,爬虫名为wxapp_spider.py
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from wxapp.items import WxappItem  # 导入items中定义好的数据类,方便json格式写入
class WxappSpiderSpider(CrawlSpider):
name = 'wxapp_spider'
allowed_domains = ['wxapp-union.com']
start_urls = ['http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1']  # 从第一页开始
rules = (
# Rule 1用于从开始页面向后面找到相同模式的url,所以follw选择True,
Rule(LinkExtractor
(allow=r'.+mod=list&catid=2&page=\d+'), follow=True),
# Rule 2用于在Rule 1模式的页面下,找到真正需要解析数据的url,回调函数一定要改名字。
Rule(LinkExtractor(allow=r'.+/article-.+\.html'), callback='parse_info', follow=False),)

def parse_info(self, response):
title = response.xpath(r"//h1[@class='ph']/text()").get()  #获取标题
author = response.xpath(r"//p[@class='authors']/a/text()").get()  # 获取作者
contents = response.xpath(r"//td[@id='article_content']//text()").getall()
# 获取内容   因为td下面还有很多标签所以要用//text() 之后再.getall()
content = ''.join(contents).strip()
# 巧妙用法 join将列表中的每一项依次放入  加上.strp() 去掉多余的换行和空格
info = WxappItem(title=title, author=author, content=content)  #创建info对象
yield info  # 推送给pipelines.py

多个rule下,先执行rule1,然后再rule1提取的相应页面再执行rule2,后回调给parse_info处理。

LinkExtractor

LinkExtractor 是scrapy模块下的链接提取器,包含以下参数:

class scrapy.linkextractors.LinkExtractor(
allow = (),
deny = (),
allow_domains = (),
deny_domains = (),
deny_extensions = None,
restrict_xpaths = (),
tags = ('a','area'),
attrs = ('href'),
canonicalize = True,
unique = True,
process_value = None
)

主要参数讲解:

allow:允许的url。所有满足这个正则表达式的url都会被提取。
deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
restrict_xpaths:严格的xpath。和allow共同过滤链接。
unique: 规定是否去重链接

使用时要先导入:

from scarpy.linkextractor import LinkExtractor

Rule规则类:
定义爬虫的规则类。以下对这个类做一个简单的介绍:

class scrapy.spiders.Rule(
link_extractor,
callback = None,
cb_kwargs = None,
follow = None,
process_links = None,
process_request = None
)
主要参数讲解:

link_extractor:一个LinkExtractor对象,用于定义爬取规则。
callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
follow:指定根据该规则从response中提取的链接是否需要跟进。
process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

保存数据为csv,只需在setting.py中添加代码:

FEED_URI='./storage/data/%(name)s.csv'
FEED_FORMAT='CSV'
FEED_EXPORT_ENCODING='ansi'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: