Python 爬虫案例(三)--时间比较

爬取的网站是:https://alamedaca.gov/business/bids-rfps
可以看到这样的标书,左侧是标书的title,右侧是标书的截止时间,这里我们要做一个时间比较,过滤掉那些已经过期的标书,而且下边有next按钮,我们需要翻页:
Python 爬虫案例(三)--时间比较_第1张图片
在终端创建新的project,取名为CSDN2,爬虫名字就叫做alamedaca好了:
Python 爬虫案例(三)--时间比较_第2张图片
在PyCharm中打开刚刚创建的CSDN2这个project,然后编写items.py:

from scrapy import Item,Field

class Csdn2Item(Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = Field()
    dueDate = Field()    #截止日期

然后setting.py中改一下:ROBOTSTXT_OBEY = False
我们看一下目标网站的title在哪里定位,这次我们用css,可以看见每条标书都在一条一条的tr当中,每一页有10条标书,tbody就包含10条tr,title就包含td.views-field.views-field-title中,最后就是截止日期,包含在span.date-display-single当中:
Python 爬虫案例(三)--时间比较_第3张图片
接下来,在alamedaca.py中编写脚本,我们先写没有去掉过期标书的脚本,看看有多少条:

import scrapy
from scrapy import Request
from CSDN2.items import Csdn2Item

class alamedacaSpider(scrapy.Spider):
    name = 'alamedaca'
    start_urls = ['https://alamedaca.gov/business/bids-rfps']
    domain = 'https://alamedaca.gov'

    def parse(self, response):
        item = Csdn2Item()
        result_list = response.css("table.views-table.cols-2 tbody tr")
        for result in result_list:
            duedate= result.css('span.date-display-single::text').extract_first()
            item['dueDate']=duedate
            title = result.css('td.views-field.views-field-title a::text').extract_first()
            item['title'] = title
            yield item
        #获取next按钮的链接,进行翻页
        next = response.css('li.pager-next a::attr(href)').extract_first()
        next_url = response.urljoin(next)
        yield Request(next_url,self.parse) #将下一页继续放入parse函数中进行爬取

在terminal中运行,把结果写进csv文件中:
scrapy crawl alamedaca -o alamedaca.csv
运行完之后,我们查看爬取了多少条数据:
cat -n alamedaca.csv
我的结果是182条数据,大家可能跟我不一样,因为标书实时更新,这个结果是没有去掉过期数据的结果,接下来我们将过期的标书去掉,以下是新的alamedaca.py:

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
from CSDN2.items import Csdn2Item
from dateutil.parser._parser import parse
import time

class alamedacaSpider(scrapy.Spider):
    name = 'alamedaca'
    start_urls = ['https://alamedaca.gov/business/bids-rfps']
    domain = 'https://alamedaca.gov'

    def parse(self, response):
        item = Csdn2Item()
        result_list = response.css("table.views-table.cols-2 tbody tr")
        for result in result_list:
            duedate= result.css('span.date-display-single::text').extract_first()
            if duedate:   #因为有的截止日期为空,所以要进行以下判断
                if self.compare_time(str(duedate)):  #调用下面的compare_time函数
                    item['dueDate']=duedate
                    title = result.css('td.views-field.views-field-title a::text').extract_first()
                    item['title'] = title
                    yield item
        next = response.css('li.pager-next a::attr(href)').extract_first()
        next_url = response.urljoin(next)
        yield Request(next_url,self.parse)

    def compare_time(cls,bid_time):
        #from dateutil.parser._parser import parse 真的是一个很强大的工具,可以将绝大多数时间转换成标准格式
        #然后通过timestamp()将日期和时间转换为时间戳,和现在的时间进行比较
        data_time = parse(bid_time).timestamp()  
        current_time = time.time()
        if data_time > current_time:
            return True
        else:
            return False

在terminal中先清空之前的alamedaca.csv文件再运行,把结果写进csv文件中:
rm alamedaca.cvs
scrapy crawl alamedaca -o alamedaca.csv

运行完之后,我们查看爬取了多少条数据:
cat -n alamedaca.csv
结果变成了6条数据,这6条才是有用的标书:
Python 爬虫案例(三)--时间比较_第4张图片

你可能感兴趣的:(python爬虫)