6.1.Scrapy项目

Scrapy项目(未登录的情况下)

首先,我们从不需要登录的场景下设计scrapy项目,我们使用scrapy获取信息。我们创建scrapy项目:

(env) ....\TempStack>scrapy startproject book

我们首先在items中定义我们需要的Item:

import scrapy

class BookItem(scrapy.Item):
    name = scrapy.Field()            # 书名
    ratings = scrapy.Field()         # 评分
    content = scrapy.Field()         # 综合信息内容

然后实现spider,我们命名为bookspider.py

import scrapy
from book.items import BookItem

class BookSpider(scrapy.Spider):
	# 爬虫的名字, 用于运行项目指明爬虫是哪一个
    name = 'book-spider'
    allowed_domains = ['xxx.com']
    start_urls = [
        'https://book.xxx.com/top250'
    ]

    def parse(self, response):
        # 请求第一页
        yield scrapy.Request(response.url, callback=self.parse_next)

        # 请求其它页
        for page in response.xpath('//div[@class="paginator"]/a'):
            link = page.xpath('@href').extract()[0]
            # 将当前link放进请求,
            # 虽然每次请求其他页时会遇到之前已经请求过的URL, 但scrapy可以帮助我们自动过滤已处理的URL
            yield scrapy.Request(link, callback=self.parse_next)

    def parse_next(self, response):
        for item in response.xpath('//tr[@class="item"]'):
            book = BookItem()
            # XPath说明: td[2]/div[1]/a/@title中, td[2]表示tr[@class="item"]下的第二个td元素
            book['name'] = item.xpath('td[2]/div[1]/a/@title').extract()[0]
            book['content'] = item.xpath('td[2]/p/text()').extract()[0]
            book['ratings'] = item.xpath('td[2]/div[2]/span[2]/text()').extract()[0]
            yield book

运行项目:

(env) ....\TempStack\book>scrapy crawl book-spider -o book_info.csv

注意,运行需要指定spider的名称。收集到的内容日志打印如下:

{'content': '[以色列] 尤xxx利 / 林x宏 / 中xxx社 / 2014-11 / 6xx0元',
 'name': '人xx史',
 'ratings': '9.1'}
...
{'content': 'J.K.罗琳 (J.K.Rowling) / 苏农 / 人xxxx社 / 2xxxxx1 / 4xxx0元',
 'name': '哈xx特',
 'ratings': '9.7'}

基于cookie登录

现在,考虑使用scrapy添加cookie信息,这样可以做到简单快捷,但也是不稳定的。

我们将此任务建立在之前的项目book下,这里,我们仅演示scrapy基于cookie登录。

我们打开已登录的页面,使用开发工具找到cookie,复制值,但是这个值是适合requests但不适合scrapy的格式,所以要进行格式转换,转换成字典:

import re

strs = 'viewed="26397183"; ...; __utmb=30149280.47.10.1643374436'
strList = re.split(r';\S*', strs)
cookie = {}
for items in strList:
    item = items.split('=')
    key, value = item[0], item[1]
    cookie[str(key)] = str(value)
print(cookie)

我们创建一个新的spider,并复制新的cookie格式,只要在scrapy.Request请求中加入cookie信息,就实现了对应网页的cookie登录:

import scrapy

class LoginSpider(scrapy.Spider):
    name = 'login'
    allowed_domains = ['xxx.com']
    start_urls = ['https://www.xxxx.com/people/2122xxx46/']
    profile_url = "https://www.xxxx.com/people/2122xxx46/"
    cookie = {'viewed': '"26397183"', ..., ' __utmb': '30149280.47.10.1643374436'}

    def start_requests(self):
        yield scrapy.Request(self.profile_url, callback=self.parse_profile, cookies=self.cookie)

    def parse_profile(self, response):
       print(response.text)

你可能感兴趣的:(爬虫,爬虫,python,数据挖掘)