关键词

如何使用Scrapy框架?

Scrapy是一个用Python编写的开源web爬虫框架。它能快速高效地从网站上提取数据,并可在多个网页和网站之间自由转换。

下面是如何使用Scrapy框架的详细攻略:

安装Scrapy

使用pip安装Scrapy框架:

pip install scrapy

创建新的Scrapy项目

在终端中使用如下命令,创建新的Scrapy项目:

scrapy startproject myproject

此命令将在当前目录中创建一个名为myproject的新目录,包含Scrapy项目的基本文件结构。

创建新的Spider

使用如下命令,在Scrapy项目中创建一个新的Spider:

scrapy genspider spider_name domain.com

其中,spider_name是Spider的名称,domain.com是Spider将要抓取数据的网站域名。

配置Spider

打开Spider所在的.py文件,并按照如下示例进行配置:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com']

    def parse(self, response):
        # 在这里编写解析获取数据的代码

其中,name属性指明了Spider名称,start_urls属性是一个列表,包含了Spider将要抓取数据的初始URL。在parse方法中,编写解析获取数据的代码。

解析数据

使用XPath或CSS选择器在网页上获取数据。

例如,在.items文件中定义你的数据项:

import scrapy

class MyItem(scrapy.Item):
    title = scrapy.Field()
    content = scrapy.Field()

然后,在parse方法中解析数据:

def parse(self, response):
    for post in response.xpath('//div[@class="post"]'):
        item = MyItem()
        item['title'] = post.xpath('a/@title').extract_first()
        item['content'] = post.xpath('p/text()').extract_first()
        yield item

以上示例代码会在每个需要获取数据的元素中创建MyItem实例,并将title和content字段值分别赋值为元素中的标题和内容。

运行Spider

使用如下命令,运行Spider:

scrapy crawl spider_name

其中,spider_name为待运行的Spider的名称。

至此,你已经成功的创建、配置、解析数据、并成功的运行了Scrapy框架。

下面提供两个Scrapy爬虫的示例:

Scrapy爬取知乎热榜

创建一个爬取知乎热门话题的爬虫:

import scrapy
import json

class ZhihuSpider(scrapy.Spider):
    name = 'zhihu'
    headers = {
        'accept': 'application/json, text/plain, */*',
        'referer': 'https://www.zhihu.com/explore',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
        'authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20',
    }
    api = 'https://www.zhihu.com/api/v3/feed/topstory/hot-lists/%3Fdesktop=true'

    def start_requests(self):
        yield scrapy.Request(url=self.api, headers=self.headers, callback=self.parse)

    def parse(self, response):
        result = json.loads(response.body.decode('utf-8'))
        for item in result.get('data'):
            yield {
                'title': item.get('target').get('title'),
                'url': item.get('target').get('url'),
                'excerpt': item.get('target').get('excerpt')
            }

在这个爬虫中,我们发送一个带有授权头的请求到知乎热榜上,获取最热门的话题列表并解析出他们的标题、连接和描述。

运行以下命令启动爬虫:

scrapy crawl zhihu

Scrapy爬取豆瓣电影

创建一个爬取豆瓣电影Top250的爬虫:

import scrapy
from douban.items import DoubanItem

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["douban.com"]
    start_urls = [
        "http://movie.douban.com/top250"
    ]

    def parse(self, response):
        for sel in response.xpath('//div[@class="info"]'):
            item = DoubanItem()
            item['rank'] = sel.xpath('div[@class="pic"]/em/text()').extract_first()
            item['title'] = sel.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract_first()
            item['rating_num'] = sel.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
            item['quote'] = sel.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract_first()
            item['url'] = sel.xpath('div[@class="hd"]/a/@href').extract_first()
            yield item

        next_page = response.xpath('//span[@class="next"]/a/@href')
        if next_page:
            url = response.urljoin(next_page[0].extract())
            yield scrapy.Request(url, self.parse)

在这个爬虫中,我们首先向豆瓣电影Top250发送一个请求并解析该页面。随后,我们将遍历该页面的所有电影,并解析每部电影的排名、标题、评分、引用和URL。最后,我们查找下一页的链接并通过递归调用parse方法抓取下一页的电影。

运行以下命令启动爬虫:

scrapy crawl douban

以上是如何使用Scrapy框架的详细攻略,希望有所帮助。

本文链接:http://task.lmcjl.com/news/761.html

展开阅读全文