zoukankan      html  css  js  c++  java
  • scrapy小例子--爬取山东师范大学的文章url和标题

    项目截图:布局,pani.py是发spider请求的文件主要写这个

    pipelines.py是管道文件:用来存储爬取的数据

    items.py是字段文件:用来定义爬取的字段

    注意:在使用管道时一定要配置管道的优先级

    eg:配置截图如下(照着来就行,把‘#’注释掉就行)

    创建项目:之类的见,博客前面有详解。

    pani.py的代码如下:  文件创建命令 scrapy genspider pani 'sdnu.edu.cn'     在项目的一级目录下使用(就是包含全局配置文件的那个目录下)

    import scrapy
    from shandong.items import ShandongItem
    from lxml import etree
    import re
    #http://www.sdnu.edu.cn/lecture.htm
    num=48   #全局变量,用来实现翻页和计数
    num1=1
    class PaniSpider(scrapy.Spider):
        name = 'pani'  #爬虫标识名
        allowed_domains = ['sdnu.edu.cn']  #爬虫域名
        start_urls = ['http://www.sdnu.edu.cn/lecture.htm']   #要爬取的第一个url
    
        def parse(self, response):   #处理函数
            item = ShandongItem()  #生成一个item对象,用来接受字段
            html = response.body    #获取响应正文
            html = etree.HTML(html)  #使用xpath方法,进行数据处理,不会的话,看我博客里面有
            name = html.xpath('//div//ul[@ class="chair_box chair_1"]//li/h4//a//text()')  #爬取字段
            url = html.xpath('//div//ul[@ class="chair_box chair_1"]//li/h4//a//@href')
            ap = 'http://www.sdnu.edu.cn/'   #待拼接的url
            global num  
            global num1
    
            print('-----------------第'+str(num1)+''+'-----------------')
            for i in range(len(name)):  
                item = ShandongItem()
                item['title'] = name[i]   #将url和title加入item里面
                item['url'] = url[i]
                #处理特殊情况   有的url可能不规则,读者可以跳到网址里面自己看
                if url[i][0] == 'i':
                    url[i] = ap+url[i]
                    item['url'] = url[i]
                if url[i][0] == '.':
                    url[i] = ap+url[i][2:]
                    item['url'] = url[i]
                # print(item)
                yield item   #yield 关键字,实现边生成item对象,边传进piplines.py里面进行存储
    
            #翻页处理
            num1 = num1 + 1  
            t = num - num1
            if num1 < num:
                next_url='http://www.sdnu.edu.cn/lecture/'+str(t)+'.htm'  #构造下一个爬取页面的url
                yield scrapy.Request(next_url,callback=self.parse)    #调用回调函数parse,实现翻页功能

     piplines.py文件的主要代码如下:

    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    
    
    # useful for handling different item types with a single interface
    from itemadapter import ItemAdapter
    import json
    
    #管道里面,只有三个函数有用就是这三个,最重要的是第二个,process_item函数,因为,这个函数自动执行,接受来自item字段的值,
    #__init__,和close_spider可以不写,但是process_item必须写
    #定义多个管道时,写多个类即可,里面函数还是一样的,但是,定义多个管道时,要修改配置文件settings.py,修改管道的优先级,让他们有顺序执行。
    class ShandongPipeline: def __init__(self): #构造函数 self.file=open('E:\桌面存储位置\ScrapyProject\shandong\b.txt','a') def process_item(self,item,spider): title=str(item['title'])+' ' url=str(item['url'])+' ' self.file.write(title) self.file.write(url) return item def close_spider(self,spider): pass

    items.py文件的主要代码如下:

    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class ShandongItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()   #文章标题
        url = scrapy.Field()      #文章的url

    结果截图:  执行命令 scrapy crawl pani

     

  • 相关阅读:
    Android登入界面
    安卓第4周作业
    第13周作业
    5.28上机作业
    5.22作业
    数据返回值
    登录
    安卓
    安卓第四周
    安卓第四周
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/14100183.html
Copyright © 2011-2022 走看看