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'])+'\n' url=str(item['url'])+'\n' 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