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

 

原文地址:https://www.cnblogs.com/nanfengnan/p/14100183.html