项目介绍

中国海洋石油是爬取的第一个企业,之后依次爬取了,国家电网,中国邮政,这三家公司的源码并没有多大难度,

采购信息地址:

国家电网电子商务平台

http://ecp.sgcc.com.cn/project_list.jsp?site=global&column_code=014001001&project_type=1

中国海洋石油集团有限公司

https://buy.cnooc.com.cn/cbjyweb/001/001001/moreinfo.html

中国邮政

http://www.chinapost.com.cn/html1/category/181313/7294-1.htm

项目地址:

https://github.com/code-return/Crawl_faw

实现过程与方法

1.中国海洋石油集团有限公司

中海油的信息页面很友好,并没有多大难度,实现顺序如下:

#获取首页内容
def get_one_page(url):
... #解析网页
def parse_one_page(html):
... #获取最大页码
def getMaxpage(html):
... #获取二级页面的文本内容
def getContent(url):
... #主函数
def main(): url = "https://buy.cnooc.com.cn/cbjyweb/001/001001/moreinfo.html"
html = get_one_page(url)
parse_one_page(html)
page_num = getMaxpage(html)
#拼接翻页的url,并返回翻页的源代码
for i in range(2,page_num + 1):
next_url = url.replace('moreinfo',str(i))
next_html = get_one_page(next_url)
parse_one_page(next_html)

 在主函数中需实现翻页爬取的功能,这里通过先获取网页最大页码,然后根据页码设置循环,我们从第二页开始解析网页。

在网页解析函数parse_one_page(html)中,主要实现,获取网页中的标题,发布时间,href,获取该内容之后对数据进行筛选,存储

def time_restrant(date): # 时间判断函数,判断是否当年发布的消息
thisYear = int(datetime.date.today().year)
thisMonth = int(datetime.date.today().month)
thisday = int(datetime.date.today().day)
year = int(date.split('-')[0])
month = int(date.split('-')[1])
day = int(date.split('-')[2])
#if ((thisYear - year <= 1) or (thisYear - year == 2 and month >= thisMonth)): # 爬取24个月内的信息
# if (thisYear == year and month == thisMonth and day == thisday): # 这里是设置时间的地方
#if (thisYear == year and month == thisMonth):
if (thisYear == year):
#if thisYear == year:
return True
else:
return False
def title_restraint(title,car_count, true_count):  # 标题判断函数,判断标题中是否有所需要的“车”的内容
global most_kw_arr
global pos_kw_arr
global neg_kw_arr
car_count += 1
if title.find(u"车") == -1: # or title.find(u"采购公告"):
return False,car_count, true_count
else:
#car_count += 1
neg_sign = 0
pos_sign = 0 for neg_i in neg_kw_arr:
if title.find(neg_i) != -1: # 出现了d_neg_kw中的词
neg_sign = 1
break for pos_i in pos_kw_arr:
if title.find(pos_i) != -1: # 出现了d_pos_kw中的词
pos_sign = 1
break if neg_sign == 1:
return False,car_count, true_count
else:
if pos_sign == 0:
return False,car_count, true_count
elif pos_sign == 1:
true_count += 1
return True,car_count, true_count

  将数据筛选完毕之后,对数据进行存储

def store(title, date, content, province, url): # 向nbd_message表存储车的信息
title, content = removeSingleQuote(title, content)
sql = "insert into nbd_message (title,time,content,province,href) values('%s','%s','%s','%s','%s')" % (
title, date, content, province, url)
return mySQL("pydb", sql, title, date, province) def store_nbd_log(car_count, true_count, province_file): # 向nbd_spider_log表存储爬取日志信息
sql = "insert into nbd_spider_log (total_num,get_num,pro_name,spider_time) values('%d','%d','%s','%s')" % (
car_count, true_count, province_file,str(datetime.date.today())

  流程结束

2.中国邮政

邮政的页面更加单一,但是邮政问题在于,

其每个单位都有单独的链接来展示其不同业务部门的招标信息,经过对比我发现,这个下属部门的首页链接,就差了最后一点不一样,因此我偷了个懒,多加了个循环

def main():
"""
urls中分别对应着集团公司,省邮政分公司,邮政储蓄银行,中邮保险,集团公司直属单位
"""
urls = ['7294-','7331-','7338-','7345-','7360-']
for i in range(0,len(urls)):
strPost = '1.htm'#url后缀
base_url = "http://www.chinapost.com.cn/html1/category/181313/" + str(urls[i])
url = base_url + strPost
html = get_one_page(url)
# print(html)
parse_one_page(html)
page_num = getMaxpage(html)
getMaxpage(html)
for i in range(2,page_num + 1):
next_url = base_url + strPost.replace('1',str(page_num))
next_html = get_one_page(next_url)
parse_one_page(next_html)

 邮政完成

3.国家电网

国家电网是我遇到的第一个问题,他的问题在于,在所需要的每个公告里面的href中,给出的不是通常的二级页面链接,而是JavaScript的两个参数,

href=”javascript:void(0);”这个的含义是,让超链接去执行一个js函数,而不是去跳转到一个地址,
而void(0)表示一个空的方法,也就是不执行js函数。
为什么要使用href=”javascript:void(0);”
javascript:是伪协议,表示url的内容通过javascript执行。void(0)表示不作任何操作,这样会防止链接跳转到其他页面。这么做往往是为了保留链接的样式,但不让链接执行实际操作, <a href="javascript:void(0)" onClick="window.open()"> 点击链接后,页面不动,只打开链接 <a href="#" onclick="javascript:return false;"> 作用一样,但不同浏览器会有差异

 而二级页面的链接与属性onclick里面的两个数字有关!!!因此我用onclick的两个参数,进行二级页面的拼接,

 hrefAttr = selector.xpath("//*[@class='content']/div/table[@class='font02 tab_padd8']/tr/td/a/@onclick")

    for i in range(0,len(hrefAttr)):
#获取二级页面的跳转参数,以便进行二级页面url拼接
string = str(hrefAttr[i])
attr1 = re.findall("\d+",string)[0]
attr2 = re.findall("\d+",string)[1]

 

结语

继续搬砖......

Python爬虫与一汽项目【一】爬取中海油,邮政,国家电网问题总结的更多相关文章

  1. Python爬虫学习三------requests+BeautifulSoup爬取简单网页

    第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...

  2. python爬虫实践(二)——爬取张艺谋导演的电影《影》的豆瓣影评并进行简单分析

    学了爬虫之后,都只是爬取一些简单的小页面,觉得没意思,所以我现在准备爬取一下豆瓣上张艺谋导演的“影”的短评,存入数据库,并进行简单的分析和数据可视化,因为用到的只是比较多,所以写一篇博客当做笔记. 第 ...

  3. Python爬虫与一汽项目【二】爬取中国东方电气集中采购平台

    网站地址:https://srm.dongfang.com/bid_detail.screen 东方电气采购的页面看似很友好,实际上并不好爬取 在观察网页的审查元素之后发现,1处的网页响应只是单纯的一 ...

  4. Python爬虫与一汽项目【综述】

    项目来源 这个爬虫项目是 去年实验室去一汽后的第一个项目(基本交工,现在处于更新维护阶段).内容大概是,获取到全国31个省份政府的关于汽车的招标公告,再用图形界面的方式展示爬虫内容.在完成政府招标采购 ...

  5. Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

    目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...

  6. Python爬虫学习之使用beautifulsoup爬取招聘网站信息

    菜鸟一只,也是在尝试并学习和摸索爬虫相关知识. 1.首先分析要爬取页面结构.可以看到一列搜索的结果,现在需要得到每一个链接,然后才能爬取对应页面. 关键代码思路如下: html = getHtml(& ...

  7. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  8. python爬虫入门新手向实战 - 爬取猫眼电影Top100排行榜

    本次主要爬取Top100电影榜单的电影名.主演和上映时间, 同时保存为excel表个形式, 其他相似榜单也都可以依葫芦画瓢 首先打开要爬取的网址https://maoyan.com/board/4, ...

  9. 小白学 Python 爬虫(25):爬取股票信息

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. jdbc连接oracle时报错 Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableC

    错误: Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; ...

  2. [Day21]异常

    1.异常-Java代码在运行时期发生的问题,在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息 1.1 异常的继承体系 Throwable:它是所有错误与异 ...

  3. NABCD---生活日历

    本软件的主体为日历.如今人们的生活趋于现代化,大家主要通过手机来查看日期,但我们每一天都有想要做或未完成的事情,也存在对自己有特殊意义的日子.每天人们都会有或大或小的支出与收入,想要系统的记录这些支出 ...

  4. vue 父组件给子组件传值,子组件给父组件传值

    父组件如何给子组件传值 使用props 举个例子: 子组件:fromTest.vue,父组件 app.vue fromTest.vue <template> <h2>{{tit ...

  5. ElasticSearch - 信息聚合系列之聚合过滤

    摘要 聚合范围限定还有一个自然的扩展就是过滤.因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上. 版本 elasticsearch版本: elasticsearch-2. ...

  6. #pragma pack的使用

    #pragma pack的作用 程序编译器对变量的存储带有一定随机性,而pragma pack是一种字节对齐方法,采用人为设定的方式将存储数据按一定格式排布.百科中提到了其一种作用:有的平台每次读都是 ...

  7. C++ STL学习之 空间配置器(allocator)

    众所周知,一般情况下,一个程序包括数据结构和相应的算法,而数据结构作为存储数据的组织形式,与内存空间有着密切的联系. 在C++ STL中,空间配置器便是用来实现内存空间(一般是内存,也可以是硬盘等空间 ...

  8. 《图解HTTP》读书笔记(一:网络基础TCP/IP)

    好书什么时候开始读都不晚.作为一个测试人员,是一定要掌握一些网络的基础知识的.希望能够边读书边在这里记录笔记,便于加深理解以及日后查阅. 一.TCP/IP协议族 计算机与网络设备要互相通信,双方必须基 ...

  9. pyothon学习笔记2-元组

    # 1.元组对象不可修改,元组中列表对象的对象可以修改 t = (1,2,[1,2,3]) t[2] = [1,2,3,4] # 'tuple' object does not support ite ...

  10. MySQL数据库一般设计规则

    一.数据库设计 规则一之存储规则: 一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所 ...