首先,我们从不需要登录的场景下设计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'}
现在,考虑使用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)