scrapy框架之日志等级和请求传参-cookie-代理

时间:2023-03-08 15:51:31

一.Scrapy的日志等级

  - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息。

  - 日志信息的种类:

        ERROR : 一般错误

        WARNING : 警告

        INFO : 一般的信息

        DEBUG : 调试信息

       

  - 设置日志信息指定输出:

    在settings.py配置文件中,加入

LOG_LEVEL = ‘指定日志信息种类’即可。

LOG_FILE = 'log.txt'则表示将日志信息写入到指定文件中进行存储。

二.请求传参

  - 在某些情况下,我们爬取的数据不在同一个页面中,例如,我们爬取一个电影网站,电影的名称,评分在一级页面,而要爬取的其他电影详情在其二级子页面中。这时我们就需要用到请求传参。

  - 案例展示:爬取www.id97.com电影网,将一级页面中的电影名称,类型,评分一级二级页面中的上映时间,导演,片长进行爬取。

  爬虫文件:

# -*- coding: utf-8 -*-

import scrapy

from moviePro.items import MovieproItem

class MovieSpider(scrapy.Spider):

    name = 'movie'

    allowed_domains = ['www.id97.com']

    start_urls = ['http://www.id97.com/']

    def parse(self, response):

        div_list = response.xpath('//div[@class="col-xs-1-5 movie-item"]')

        for div in div_list:

            item = MovieproItem()

            item['name'] = div.xpath('.//h1/a/text()').extract_first()

            item['score'] = div.xpath('.//h1/em/text()').extract_first()

            #xpath(string(.))表示提取当前节点下所有子节点中的数据值(.)表示当前节点

            item['kind'] = div.xpath('.//div[@class="otherinfo"]').xpath('string(.)').extract_first()

            item['detail_url'] = div.xpath('./div/a/@href').extract_first()

            #请求二级详情页面,解析二级页面中的相应内容,通过meta参数进行Request的数据传递

            yield scrapy.Request(url=item['detail_url'],callback=self.parse_detail,meta={'item':item})

    def parse_detail(self,response):

        #通过response获取item

        item = response.meta['item']

        item['actor'] = response.xpath('//div[@class="row"]//table/tr[1]/a/text()').extract_first()

        item['time'] = response.xpath('//div[@class="row"]//table/tr[7]/td[2]/text()').extract_first()

        item['long'] = response.xpath('//div[@class="row"]//table/tr[8]/td[2]/text()').extract_first()

        #提交item到管道

        yield item

items文件:

# -*- coding: utf-8 -*-

# Define here the models for your scraped items

# See documentation in:

# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class MovieproItem(scrapy.Item):

    # define the fields for your item here like:

    name = scrapy.Field()

    score = scrapy.Field()

    time = scrapy.Field()

    long = scrapy.Field()

    actor = scrapy.Field()

    kind = scrapy.Field()

    detail_url = scrapy.Field()

管道文件:

# -*- coding: utf-8 -*-

# Define your item pipelines here

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

import json

class MovieproPipeline(object):

    def __init__(self):

        self.fp = open('data.txt','w')

    def process_item(self, item, spider):

        dic = dict(item)

        print(dic)

        json.dump(dic,self.fp,ensure_ascii=False)

        return item

    def close_spider(self,spider):

        self.fp.close()

三、cookie

豆瓣网个人登录,获取该用户个人主页这个二级页面的页面数据。

如何发起post请求?

一定要对start_requests方法进行重写。

  1. Request()方法中给method属性赋值成post
  2. FormRequest()进行post请求的发送
# -*- coding: utf-8 -*-
import scrapy class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['www.douban.com']
start_urls = ['https://accounts.douban.com/j/mobile/login/basic'] # 重写start_requests方法
def start_requests(self):
# 将请求参数封装到字典
data = {
'ck': '',
'name': 'username',
'password': 'passwd',
'remember': 'false',
'ticket': '',
}
for url in self.start_urls:
yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse) # 针对个人主页页面数据进行解析操作
def parseBySecondPage(self, response):
fp = open('second.html', 'w', encoding='utf-8')
fp.write(response.text) # 可以对当前用户的个人主页页面数据进行指定解析操作 def parse(self, response):
# 登录成功后的页面数据进行存储
fp = open('main.html', 'w', encoding='utf-8')
fp.write(response.text) # 获取当前用户的个人主页
url = 'https://www.douban.com/people/1xxxxxxxxx/'
yield scrapy.Request(url=url, callback=self.parseBySecondPage)

四、 代理:

下载中间件作用:拦截请求,可以将请求的ip进行更换。

流程:

  1. 下载中间件类的自制定

a) object

b) 重写process_request(self,request,spider)的方法

  1. 配置文件中进行下载中间价的开启。

daili.py

class DailiSpider(scrapy.Spider):
name = 'daili'
# allowed_domains = ['www.baidu.com']
start_urls = ['https://www.baidu.com/s?wd=ip'] def parse(self, response):
fp = open('proxy.html', 'w', encoding='utf-8')
fp.write(response.text)

middlewares.py

from scrapy import signals

class MyProxy(object):
def process_request(self, request, spider):
# 请求ip的更换
request.meta['proxy'] = "http://201.245.172.157:80"

settings.py

DOWNLOADER_MIDDLEWARES = {
'proxyDemo.middlewares.MyProxy': 543,
}