Python简单的新闻内容获取

简单的新闻内容获取

1、网址:http://www.mot.gov.cn/jiaotongyaowen/index.html,只爬取第一页内容
2、确定所需内容,提前写好xpath格式进行匹配
3、所需模块如下,都用 pip3 install 模块名
4、小白,初次写博客,多多包涵,互相学习

import pymysql
import random
import time
import requests
import datetime
from lxml import etree
from useragents import ua_list

4、接下来建立一个类(简单的爬虫框架)

class News1(object):
    def __init__(self):
        # 定义所需的变量,如:爬去地址,请求头,若要将数据保存在数据库,则
        # 链接数据库,创建游标

    # 获取html功能函数
    def get_html(self):

    # 解析函数 - 得到各个新闻链接
    def parse_html(self):
        
    # 二级获取HTML内容
    def get_html2(self,url1):
        
    # 爬取数据之前先到数据库中查询比对
    def is_go_on(self,title):
       
    # 保存数据
    def save_news(self,title,fromWhere,datetime,content):
        
    def run(self):
        self.get_html()
        self.parse_html()
       
if __name__ == '__main__':
    start = time.time()
    s = News1()
    s.run()
    end = time.time()
    print('运行时间:{}'.format(end-start))

5、实际操作,导包、访问地址,伪装请求头,链接数据库;然后将访问地址的所有内容返回成字符串的形式

import pymysql
import random
import time
import requests
import datetime
from lxml import etree
from useragents import ua_list

class News1(object):
    def __init__(self):
        self.url = 'http://www.mot.gov.cn/jiaotongyaowen/'
        self.headers = {'User-Agent': random.choice(ua_list)}
        self.db = pymysql.connect('IP地址', '用户', '密码', '库名', charset='utf8')
        self.cur = self.db.cursor()

    # 获取html功能函数
    def get_html(self):
        html = requests.get(url=self.url, headers=self.headers).content.decode('utf-8', 'ignore')
        return html

6、对第一次获取的内容进行第一次解析,从内容中得到各个新闻的链接;这里的xpath就是一种对网页内容解析的方法,与正则类似;但是需要谷歌浏览器,首先需要谷歌访问助手,然后通过助手搜索下载就可以了;F12查看网页,在所需解析的标签上单击鼠标右键,会出现一个copy Xpath,然后快捷键 ctrl+shift+x,可以复制的xpath进行校验,左框是方法,右框是内容。

# 解析函数 - 得到各个新闻链接
    def parse_html(self):
        html = self.get_html()
        parse_html = etree.HTML(html)
        r_list = parse_html.xpath('/html/body/div/div/div/div/div/a/@href')
        # self.get_html2(r_list[0])
        for i in r_list:
           self.get_html2(i)

7、对第一次匹配出的各个链接进行第二次访问,从而拿到我们所需网页的内容,由于新闻内容的链接是通过第一次访问的链接跳转的,所以需要通过第一个链接+解析出的各个新闻链接,观察地址栏的链接和解析出来的各个新闻链接。
在拿到数据之后,要对数据进行保存,保存时又不能与之前的内容相同,于是就进行一个校验;(通常校验会有一个特殊的指纹,指纹采用md5对访问地址加密,假如下次要爬取这个链接,则校验数据库是否爬取过这个链接)

# 二级获取HTML内容
    def get_html2(self,url1):
        t_url = 'http://www.mot.gov.cn/jiaotongyaowen/' + url1
        html = requests.get(url=t_url,headers=self.headers).content.decode('utf-8', 'ignore')
        parse_html = etree.HTML(html)
        title = parse_html.xpath('/html/body/div[2]/div[2]/h1')  # 题目
        ft = parse_html.xpath('/html/body/div[2]/div[2]/h3/font')  # 来源 时间
        content = parse_html.xpath('//*[@id="Zoom"]/div[1]/div/p')  # 内容
        title = title[0].text
        fromWhere = ft[0].text[3:-19]
        # print(fromWhere)
        datetime = ft[0].text[-19:]
        strc = ''
        for i in content:
            strc += etree.tostring(i, encoding="utf-8", method='html').decode()
        content = strc
        # print(content)
        if self.is_go_on(title) == False:
            print('数据已存在')
            return
        else:
            return self.save_news(title,fromWhere,datetime,content)

    # 爬取数据之前先到数据库中查询比对
    def is_go_on(self,title):
        sel = 'SELECT title FROM dj_news WHERE type=1 ORDER BY id DESC LIMIT 300'
        self.cur.execute(sel)
        result = self.cur.fetchall()
        tit_r = []
        for i in result:
            tit_r.append(i[0])
        # print(tit_r)
        if title in tit_r:
            return False
        else:
            return True

8、对拿到的数据进行保存,则完事~

 # 保存数据
    def save_news(self,title,fromWhere,datetime,content):
        title = title
        abstractM = title
        fromWhere = fromWhere
        datetime = datetime
        content = content
        type = '1'
        status = '1'
        # 数据库操作
        sql = "insert into dj_news (title,type,abstractM,fromWhere,createTime,content,status) values (%s,%s,%s,%s,%s,%s,%s)"
        self.cur.execute(sql, [title, type, abstractM, fromWhere, datetime, content,status])
        self.db.commit()
        print('数据存储完成')

    def run(self):
        self.get_html()
        self.parse_html()


if __name__ == '__main__':
    start = time.time()
    s = News1()
    s.run()
    end = time.time()
    print('运行时间:{}'.format(end-start))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值