1 2 Fork me on GitHub 6

scrapy (2)- get请求

”python爬虫系列“目录:

scrapy中的get请求及基本使用:

1. 创建scrapy项目

scrapy startproject QiuBaiProject

2. 创建爬虫文件

scrapy genspider QiuBai  www.qiubai.com

3.修改配置文件

"""
setting.py :配置文件
"""

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
	#使用哪个管道处理,后面是管道优先级 1-1000,数字越低,优先级越高
   'qiubaiproject.pipelines.QiubaiprojectPipeline': 300,
}

"""
关于日志的说明:默认显示的等级是DEBUG,上面所有的信息全部显示
如果等级配置为ERROR,那么就只显示ERROR,CRITICAL
在配置文件中进行配置
"""
	# 配置显示日志信息等级
	# LOG_LEVEL = 'ERROR'
	# 不将信息显示到屏幕中,将信息显示到文件中
	LOG_FILE = 'log.txt'

4. 编写item.py文件

"""
  items.py : 这里面是定义数据结构的地方
"""

import scrapy


class QiubaiprojectItem(scrapy.Item):
  """
	item对象的用法和字典的用法一模一样,可以快速的转化为字典
  """
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 图片链接
    image_src = scrapy.Field()
    # 用户名
    name = scrapy.Field()
    # 年龄
    age = scrapy.Field()
    # 内容
    content = scrapy.Field()
    # 好笑个数
    haha_count = scrapy.Field()
    # 评论个数
    ping_count = scrapy.Field()

5. 编写爬虫文件

# -*- coding: utf-8 -*-
'''
QiuBai.py 爬虫文件
'''

import scrapy
from qiubaiproject.items import QiubaiprojectItem


class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ['www.qiushibaike.com']
    
    #起始页
    start_urls = ['http://www.qiushibaike.com/']

    # 爬取其他页面的内容
    url = 'https://www.qiushibaike.com/8hr/page/{}/'
    page = 1

    def parse(self, response):
        # 先找到所有的div
        div_list = response.xpath('//div[@id="content-left"]/div')
        # 遍历这个div的列表,依次获取里面的每一条信息
        for odiv in div_list:
            # 创建对象
            item = QiubaiprojectItem()
            # 用户头像
            face = 'https:' + odiv.xpath('.//div[1]//img/@src')[0].extract()
            # 用户的名字
            name = odiv.xpath('.//div[1]//h2').extract()[0]
            # 用户的年龄
            age = odiv.xpath('.//div[starts-with(@class,"articleGender")]').extract_first()
            # 获取用户内容
            ospan = odiv.xpath('.//div[@class="content"]/span[1]')[0]
            content = ospan.xpath('string(.)').extract()
            # 用户的好笑个数
            haha_count = odiv.xpath('.//div[@class="stats"]/span[@class="stats-vote"]/i/text()').extract()[0]
            # 获取评论个数
            ping_count = odiv.xpath('.//div[@class="stats"]/span[@class="stats-comments"]//i/text()').extract()[0]

            # 将提取的信息保存起来
            item['image_src'] = face
            item['name'] = name
            item['age'] = age
            item['content'] = content
            item['haha_count'] = haha_count
            item['ping_count'] = ping_count
            
            yield item
        # 接着爬取其他的页面
        if self.page <= 5:
            self.page += 1
            # 拼接出来指定的url
            url = self.url.format(self.page)
            # 接着发送请求,callback是发送请求之后,用哪一个回调函数处理这个请求
            yield scrapy.Request(url=url, callback=self.parse)

6.编写管道文件

# -*- 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 QiubaiprojectPipeline(object):
    # 爬虫启动的时候只会调用一次
    def open_spider(self, spider):
        # 将文件的打开写道这里
        self.fp = open('qiubai.json', 'w', encoding='utf8')

    # 这个函数就是处理item的函数,每一个item过来都会回调这个方法
    def process_item(self, item, spider):
        # 将对象转化为字典
        obj = dict(item)
        # 将字典转化为json格式字符串
        string = json.dumps(obj, ensure_ascii=False)
        self.fp.write(string + '\n')
        return item

    # 爬虫结束的时候回调这个方法
    def close_spider(self, spider):
        self.fp.close()
posted @ 2020-05-26 13:14  peng_li  阅读(1458)  评论(0编辑  收藏  举报
1