基于feapder框架进行山西省招标投标公告服务平台网站的爬取,已下均展示部分代码
一:确定网站
这里我们将爬取左边部分公告公示的数据,以及翻页爬取,将每一页的url以及详情参数传到parse()函数(feapder默认的解析函数)里进行分析
class SpiderCode(feapder.AirSpider):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.params = {
"10": "资格预审公告",
"11": "招标公告",
"12": "中标候选人公示",
"13": "中标结果公示",
"14": "更正公告公示",
}
def start_requests(self):
for i,j in self.params.items():
url = f"https://www.sxbid.com.cn/f/new/notice/list/{i}"
for i in range(0, 2):
self.data = {
"pageNo": i,
"pageSize": "15",
"title": "",
"recentType": ""
}
yield feapder.Request(url,
method='GET',
callback=self.parse,
parser=self.params,
meta=meta_detail,
data=self.data,
)
二:列表页的数据提取
这里采用xpath对它的标题类型发布时间等数据就行提取,并得到详情页的数据并发送到parse_detail()函数里
def parse(self, request, response):
for i in range(1, 16):
item_list =response.xpath(f'/html/body/div/div[5]/div/div/div[2]/table/tbody/tr[{i}]')
url = item_list.xpath('./td[1]/a/@href').extract_first()
title = item_list.xpath('./td[1]/a/@title').extract_first()
yield feapder.Request(
url,
download_midware=self.download_midware,
meta=meta_detail,
callback=self.parse_detail,
verify=False,
)
三: 详情页pdf爬取处理
这里可以看到公告信息是一个完整的pdf文件
对他进行抓包时,可以发现pdf文件数据并不能在preview里面展示出来,所以现在需要寻找这个pdf文件的具体位置,最后我在下面找到了pdf文件的位置,
这里我们可以观看一下这个url返现这个就是他的pdf数据
但是我们在列表页拿到是不是他pdf数据的url,所以现在需要对他pdf数据的url研究可以发现他是后面的fle后面不同,所以我们现在的问题变成了如何找到file=后面的数据,我们将它复制查找一下可以发现他在列表返回详情页里
所以我们接下来利用正则拿到这个数据然后进行拼接就可以得到他的pdf数据的url
def parse_detail(self, request, response):
if response.status_code == 702:
raise ValueError
b = r'rdm=3&file=(.*?)"></ifr'
pdf = re.findall(b, response.text)
pdf = str(pdf)
pdf = pdf.split("['")[1].split("']")[0]
pdf_url='https://www.sxbid.com.cn/static/pdfjs/pdfjs-2.5.207-es5-dist/web/viewer.html?rdm=3&file='+str(pdf)
这样就拿到了页面内的pdf信息,便可存在数据库里了,我们可以写个html文件检查一下
刚入门的小白,第一次写文章,请各位大佬指正错误和提出意见,谢谢!