爬取的网站是:https://alamedaca.gov/business/bids-rfps
可以看到这样的标书,左侧是标书的title,右侧是标书的截止时间,这里我们要做一个时间比较,过滤掉那些已经过期的标书,而且下边有next按钮,我们需要翻页:
在终端创建新的project,取名为CSDN2,爬虫名字就叫做alamedaca好了:
在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当中:
接下来,在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条才是有用的标书:
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试