某电厂集团燃料网站招标信息爬虫实例

来由

华能燃料交易网上公布华能各电厂每月的招标情况,不同于五大电其他招标网站,华能交易网站公布最高限价,对于煤炭贸易过程中的成本分析意义重大。

网站分析

1、爬取每一个招标公告的链接
2、提取链接中自己关心的数据
3、保存数据为excel

三步走

1、提取链接参考程序

#爬取超链接,注释上的筛选方式不成功
"""    if len(str(link))>=40:
        links.append(link.get('href'))
    else:
        pass
print(links)"""
from urllib.request import urlopen#用于获取网页
from bs4 import BeautifulSoup#用于解析网页
links=[]
html = urlopen('https://fec.hpi.com.cn/Order/MoreSearch?page=1')#提取所有连接
soup = BeautifulSoup(html, "html.parser")
url_list = soup.find_all('a')
for link in url_list: 
    links.append(link.get('href'))
ln = list(filter(lambda s:len(str(s)) >= 40,links))#字符串长度是否大于40,然后筛选
print(ln)
url2=[r'‘https://fec.hpi.com.cn'+ln[i] for i in range(10)]
print (url2)

2、爬取目标表格中的数据,参考程序

import requests
from lxml import etree

# 设置URL地址和请求头
url = 'http://admi.hnu.edu.cn/info/1024/3094.htm'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36',
    'Cookie': 'ASP.NET_SessionId=yolmu555asckw145cetno0um'
}

# 发送请求并解析HTML对象
response = requests.get(url, headers=headers)
html = etree.HTML(response.content.decode('utf-8'))

#  数据解析
table = html.xpath("//table//tr[position()>2]")  # XPath定位到表格,因为页面只有一个表格,所以直接//table,
# 如果有多个表格,如取第二个表格,则写为//table[1] 偏移量为1 。我们不取表头信息,所以从tr[3]开始取,返回一个列表

dep = []

for i in table:  # 遍历tr列表
    p = ''.join(i.xpath(".//td[1]//text()"))  # 获取当前tr标签下的第一个td标签,并用text()方法获取文本内容,赋值给p
    sl = ''.join(i.xpath(".//td[6]//text()"))
    sc = ''.join(i.xpath(".//td[9]//text()"))
    ll = ''.join(i.xpath(".//td[2]//text()"))
    lc = ''.join(i.xpath(".//td[5]//text()"))

    print(p, sl, sc, ll, lc)
    data = {  # 用数据字典,存储需要的信息
        '省份': ''.join(p.split()),  # .split()方法在此处作用是除去p中多余的空格 '\xa0'
        '理科一本线': ''.join(sl.split()),
        '理科投档线': ''.join(sc.split()),
        '文科一本线': ''.join(ll.split()),
        '文科投档线': ''.join(lc.split())
    }
    print(data)
    dep.append(data)
print(dep)

table 表格
tr 行
td 列
3、提取出来后,得到的是一个列表,列表里是字典元素。转化为excel参考程序。

#写入excel数据
# -*- coding: utf-8 -*-
import pandas as pd

players = [{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player1', 'bank': 0.06},
{'dailyWinners': 3, 'dailyFreePlayed': 2, 'user': 'Player2', 'bank': 4.0},
{'dailyWinners': 1, 'dailyFree': 2, 'user': 'Player3', 'bank': 3.1},
{'dailyWinners': 3, 'dailyFree': 2, 'user': 'Player4', 'bank': 0.32}]

df = pd.DataFrame.from_dict(players)

print (df)

df.to_excel('players.xlsx')

不期而遇

问题:第二个参考程序中,print(dep)数据不断增加,但是保存到list里面时候只保存了最后一项,参考程序4

list = [] 
a = {'a':'1', 'b':'1'}
list.append(a.copy())
a['a'] = '2'
a['b'] = '2'    
list.append(a.copy())  
print(list)

dict ={}写在fun()函数内,list = [] 应写在fun()函数外。而且考虑到有两个提取循环,list = [] 应写在函数的最外侧,import 下,而不是在某个fun()函数内。

其他

由于华能燃料网站平时打开就够慢了,就不公开代码了,有需要的私信。

你可能感兴趣的:(python小案例)