网页新闻抓取(公司简介大渡河公司重构url流域已完成流域规划报告(咨询稿) )

优采云 发布时间: 2021-10-13 08:23

  网页新闻抓取(公司简介大渡河公司重构url流域已完成流域规划报告(咨询稿)

)

  一、公司简介

  大渡河公司于2000年11月在成都高新区注册成立,主要任务是开发以公嘴和通街子为母电站,滚动开发大渡河流域水电站,是我国最大的水电开发、建设和国家能源集团的运营管理。综合性大型流域水电开发公司。

  公司目前主要负责大渡河流域开发和西藏巴龙藏布河流域开发建设。拥有西藏大渡河干流和支流、巴隆藏布河流域水能资源约3000万千瓦。大渡河流域规划建设梯级电站28座,总装机容量约2340万千瓦。公司负责开发干流17座梯级电站,涉及四川省三州两市(甘孜州、阿坝州、凉山州、雅安市、乐山市)的12个县。总装机容量约1757万千瓦。, 准备构建稳步推进的可持续发展格局。巴龙藏布江流域已完成流域规划报告(征求意见稿),初步规划“一库九层”规划,规划装机容量1142万千瓦。截至目前,公司总资产910.68亿元,四川装机容量约占四川水电总装机容量的四分之一。

  二、需求分析

  分析网站新闻标题、作者、日期等统计数据,分析网站在线新闻有以上共性,即哪些类型的新闻更容易上传,也可以分析公司较高的稿件作者越多,稿件越多,一定程度上可以体现作者的水平。

  三、具体实现

  1、利用python爬虫技术获取公司新闻相关信息网站

  第一步爬取url:重构url放入多线程队列

   url = 'http://www.spddr.com/spddr/index.jsp?id=360'

                base_url = 'http://www.spddr.com/spddr/'

                #获取队列中的data数据

                data = self.page_queue.get()

                #经分析,网站是通过post方法进行请求

                html = requests.post(url, headers=headers, data=data)

                tree = etree.HTML(html.text)

                #获取每条新闻的url链接

                urls = tree.xpath('//div[@class="item"]//span/a/@href')

                for u in urls:

                    # 将获取的每条新闻的url链接进行拼接,重构成新的新闻链接,并将其放入队列中

                    self.writer_queue.put(base_url + u)

                    print('*' * 30 + "正在获取第{}页地址".format(data['pages']) + '*' * 30)

                #如果队列中的已经取完了,那么就跳出while循环

                if self.page_queue.empty():

                    break

  第二步解析url:在多线程队列中获取重构后的url,并进行解析,最后将解析后的信息放入线程队列

   #若两个队列中的数据都已经获取完,那么意味着信息已经爬去完毕,于是跳出循环

if self.page_queue.empty() and self.writer_queue.empty():

break

#在队列中获取重构后的新闻链接

url = self.writer_queue.get()

#分析网页后得出具体的新闻页面时通过get方法

html = requests.get(url, headers=headers)

tree = etree.HTML(html.text)

#用xpath获取新闻标题

title = tree.xpath('//div[@class="newsContent"]//strong/font/text()')[0].strip()

#由于作者和日期是一起的,于是将信息全部获取

com = tree.xpath('//tr/td[@align="center"]/div/text()')[0]

#分析后作者和日期是用“:”分割,于是提取信息时也采用“:”分割提取

author = ":".join(com.split()).split(':')[1]

department = ":".join(com.split()).split(':')[3]

time = ":".join(com.split()).split(':')[-1]

#信息提取后重构为字典

infos = {

'title': title,

'author': author,

'department': department,

'time': time

}

print("正在获取信息标题为《{}》的文章".format(title))

#调用信息下载保存函数

self.write_infos(infos)

  第三步,下载保存信息:将解析后的信息从队列中取出,执行下载保存操作

  def write_infos(self,infos):

print(30 * '=' + "开始下载" + 30 * '=')

#由于是多线程逐条保存信息,为了避免数据出错,在保存的时候进行开锁操作

self.*敏*感*词*.acquire()

#逐条保存信息

self.writer.writerow(infos)

##由于是多线程逐条保存信息,为了避免数据出错,在保存完毕后进行锁操作

self.*敏*感*词*.release()

  四、整个代码如下

  from lxml import etree

import requests

import csv

import random

from headers_list import headers_list

import threading

from queue import Queue

headers = {

        'User-Agent':random.choice(headers_list),

        'Cookie': 'JSESSIONID=91AFDB0A74FDB3DE1011B2E59CF99993; JSESSIONID=DD7458D1055A53D464AE8DF68400DE1F',

        'Referer': '[http://www.spddr.com/spddr/index.jsp?id=360](http://www.spddr.com/spddr/index.jsp?id=360)'

    }

#定义一个Producter类,类名通常是大写开头的单词,它继承的是threading.Thread

class Producter(threading.Thread):

    # 用init方法绑定属性,比如定义一个人的类,那你可以再定义人的属性,比如有手、有脚

    def __init__(self,page_queue,writer_queue,*args,**kwargs):

        super(Producter,self).__init__(*args,**kwargs)

        self.page_queue = page_queue

        self.writer_queue = writer_queue

    def run(self):

        while True:

            try:

                url = '[http://www.spddr.com/spddr/index.jsp?id=360](http://www.spddr.com/spddr/index.jsp?id=360)'

                base_url = '[http://www.spddr.com/spddr/](http://www.spddr.com/spddr/)'

                #获取队列中的data数据

                data = self.page_queue.get()

                #经分析,网站是通过post方法进行请求

                html = requests.post(url, headers=headers, data=data)

                tree = etree.HTML(html.text)

                #获取每条新闻的url链接

                urls = tree.xpath('//div[@class="item"]//span/a/@href')

                for u in urls:

                    # 将获取的每条新闻的url链接进行拼接,重构成新的新闻链接,并将其放入队列中

                    self.writer_queue.put(base_url + u)

                    print('*' * 30 + "正在获取第{}页地址".format(data['pages']) + '*' * 30)

                #如果队列中的已经取完了,那么就跳出while循环

                if self.page_queue.empty():

                    break

            except:

                print("解析网页出错")

#定义一个Consumer类,类名通常是大写开头的单词,它继承的是threading.Thread

class Consumer(threading.Thread):

    def __init__(self,page_queue,writer_queue,*敏*感*词*,writer,*args,**kwargs):

        super(Consumer,self).__init__(*args,**kwargs)

        self.page_queue = page_queue

        self.writer_queue = writer_queue

        self.*敏*感*词* = *敏*感*词*

        self.writer = writer

    def run(self):

        while True:

            try:

                #若两个队列中的数据都已经获取完,那么意味着信息已经爬去完毕,于是跳出循环

                if self.page_queue.empty() and self.writer_queue.empty():

                    break

                #在队列中获取重构后的新闻链接

                url = self.writer_queue.get()

                #分析网页后得出具体的新闻页面时通过get方法

                html = requests.get(url, headers=headers)

                tree = etree.HTML(html.text)

                #用xpath获取新闻标题

                title = tree.xpath('//div[@class="newsContent"]//strong/font/text()')[0].strip()

                #由于作者和日期是一起的,于是将信息全部获取

                com = tree.xpath('//tr/td[@align="center"]/div/text()')[0]

                #分析后作者和日期是用“:”分割,于是提取信息时也采用“:”分割提取

                author = ":".join(com.split()).split(':')[1]

                department = ":".join(com.split()).split(':')[3]

                time = ":".join(com.split()).split(':')[-1]

                #信息提取后重构为字典

                infos = {

                    'title': title,

                    'author': author,

                    'department': department,

                    'time': time

                }

                print("正在获取信息标题为《{}》的文章".format(title))

                #调用信息下载保存函数

                self.write_infos(infos)

            except:

                print("提取信息出错!")

    def write_infos(self,infos):

        print(30 * '=' + "开始下载" + 30 * '=')

        #由于是多线程逐条保存信息,为了避免数据出错,在保存的时候进行开锁操作

        self.*敏*感*词*.acquire()

        #逐条保存信息

        self.writer.writerow(infos)

        ##由于是多线程逐条保存信息,为了避免数据出错,在保存完毕后进行锁操作

        self.*敏*感*词*.release()

if __name__ == '__main__':

    # 创建FIFO队列

    page_queue = Queue(1000)

    writer_queue = Queue(1000)

    # 创建线程锁

    *敏*感*词* = threading.Lock()

    #csv表头信息

    head = ['title', 'author', 'department', 'time']

    #打开csv文件

    fp = open('daduhe.csv', 'a', newline='', errors='ignore', encoding='utf-8')

    #用字典方式写入表头信息

    writer = csv.DictWriter(fp, head)

    writer.writeheader()

    for i in range(1,207):

        data = {

            'nowPage': i,

            'totalpage': 206,

            'id': 360,

            'pages': i,

        }

        page_queue.put(data)

    for x in range(10):

        t = Producter(page_queue,writer_queue)#根据Producter类创建一个实例t的线程

        t.start()#开启线程

    for x in range(10):

        t = Consumer(page_queue,writer_queue,*敏*感*词*,writer)#根据Producter类创建一个实例t的线程

        t.start()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线