Scrapy框架架构[2]
完成的爬虫代码:[*]爬虫部分代码:import scrapy
from abcspider.items import QsbkItem
class QsbkSpider(scrapy.Spider):
name = 'qsbk'
allowed_domains = ['qiushibaike.com']
start_urls = ['https://www.qiushibaike.com/text/']
def parse(self, response):
outerbox = response.xpath("//div[@id='content-left']/div")
items = []
for box in outerbox:
author = box.xpath(".//div//h2/text()").extract_first().strip()
content = box.xpath(".//div[@class='content']/span/text()").extract_first().strip()
item = QsbkItem()
item["author"] = author
item["content"] = content
items.append(item)
return items
2. items.py部分代码: import scrapy
class QsbkItem(scrapy.Item):
author = scrapy.Field()
content = scrapy.Field()3. pipeline部分代码: import json
class AbcspiderPipeline(object):
def __init__(self):
self.items = []
def process_item(self, item, spider):
self.items.append(dict(item))
print("="*40)
return item
def close_spider(self,spider):
with open('qsbk.json','w',encoding='utf-8') as fp:
json.dump(self.items,fp,ensure_ascii=False)
运行scrapy项目:运行scrapy项目。需要在终端,进入项目所在的路径,然后scrapy crawl [爬虫名字]即可运行指定的爬虫。如果不想每次都在命令行中运行,那么可以把这个命令写在一个文件中。以后就在pycharm中执行运行这个文件就可以了。比如现在新创建一个文件叫做start.py,然后在这个文件中填入以下代码:
from scrapy import cmdline
cmdline.execute("scrapy crawl qsbk".split())CrawlSpider在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request。
CrawlSpider爬虫:创建CrawlSpider爬虫:之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:
scrapy genspider -c crawl [爬虫名字] [域名]LinkExtractors链接提取器:使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:
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共同过滤链接。
支持分享
页:
[1]