zoukankan      html  css  js  c++  java
  • 团队开发冲刺第一天

    今天是团队冲刺开发的第一天:

      我给我们的团队里的每个人分配了现阶段的任务,我自己领取的任务是:

    ①爬取铁道大学官网的新闻

    ②将新闻准确的展示在“铁大新闻”板块上,并且可以点击后观看整篇新闻。

    今天利用爬虫去解析铁道大学新闻官网:http://xcb.stdu.edu.cn/2009-05-05-02-26-33.html

    分析后发现其标题都是在tr,class="sectiontableentry1"和class=“sectiontableentry2”的里面,因此我就将这两种全部获取

    获取后遍历存储他们的href(单个新闻的网址)

    通过对单个网址进行分析,打算存入数据库里的信息有:标题,日期,点击次数,正文,图片链接

    对于标题,日期,点击次数比较简单

    难点在于:正文的爬取和图片链接

    ①爬取正文时:正文都在div.article-content下的p标签里,因此我们获取所有的p标签的集合

    一开始我以为就是在p标签下的span里的是正文,爬取了10个后发现漏了一点东西,原来b标签里的也是正文里的内容

    由于整篇文章是有p标签分割的,一个p标签代表这一段,因此我将爬取的所有p标签遍历,之后通过p的contents来访问他的子节点,根据子节点的name属性来判断是“span”还是“p”,爬取完一段后存储到正文集合里。

    r=requests.get(url,headers=headers)
        content=r.content.decode('utf-8')
        soup = BeautifulSoup(content, 'html.parser')
        trs=soup.find_all('tr',class_='sectiontableentry1')
        trs+=soup.find_all('tr',class_='sectiontableentry2')
        for i in range(len(trs)):
            strs='http://xcb.stdu.edu.cn/'
            link=strs+trs[i].a['href']
            r = requests.get(link, headers=headers)
            content = r.content.decode('utf-8')
            soup = BeautifulSoup(content, 'html.parser')
            title=soup.find('h2',class_='contentheading').text.strip()
            title=title.replace(' ', '')
            date=soup.find('span',class_='createdate').text.strip()[5:]
            click=soup.find('span',class_='hits').text.strip()[5:-1]
            #print(title,date,click)
            #用来截取文章内容
    
            doc=[]
            listp=soup.select('div.article-content > p')
            for j in range(len(listp)):
                #print(listp[j])
                pp=''
                for k in range(len(listp[j].contents)):
                    if(listp[j].contents[k].name=='span'):
                        pp+=listp[j].contents[k].text
                    elif(listp[j].contents[k].name=='b'):
                        pp+=listp[j].contents[k].span.text
                doc.append(pp)
            doc='
    '.join(doc)
            #print(doc)

    ②爬取图片链接:

    一开始也是以为只是在span里的input标签里,之后爬取10条数据后比较原文发现少了几张图片,于是回头在取分析少的图片,发现原来有的图片在img标签里

    然后再爬取image里的图片链接,之后将两个爬取的链接合并,图片链接之间用空格分割

    单个网页爬取完成后,分析我要是爬取10页内容,发现他们之间的规律,每翻一页后面就会发生变化:

    第一页:http://xcb.stdu.edu.cn/2009-05-05-02-26-33.html

    第二页:http://xcb.stdu.edu.cn/2009-05-05-02-26-33.html?start=10

    第三页:http://xcb.stdu.edu.cn/2009-05-05-02-26-33.html?start=20

    发现start里的数字都是10个10的加,因此我们就可以翻页爬取,然后存入数据库

    数据库截图:

    python源码:

    import requests
    from bs4 import BeautifulSoup
    import json
    import pymysql
    import time
    
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}#创建头部信息
    newlist=[]
    
    
    for page in range(10):
        number=10*page
        url='http://xcb.stdu.edu.cn/2009-05-05-02-26-33.html?start='+str(number)
        f=page+1
        print('这是第'+str(f)+'')
    
        r=requests.get(url,headers=headers)
        content=r.content.decode('utf-8')
        soup = BeautifulSoup(content, 'html.parser')
        trs=soup.find_all('tr',class_='sectiontableentry1')
        trs+=soup.find_all('tr',class_='sectiontableentry2')
        for i in range(len(trs)):
            strs='http://xcb.stdu.edu.cn/'
            link=strs+trs[i].a['href']
            r = requests.get(link, headers=headers)
            content = r.content.decode('utf-8')
            soup = BeautifulSoup(content, 'html.parser')
            title=soup.find('h2',class_='contentheading').text.strip()
            title=title.replace(' ', '')
            date=soup.find('span',class_='createdate').text.strip()[5:]
            click=soup.find('span',class_='hits').text.strip()[5:-1]
            #print(title,date,click)
            #用来截取文章内容
    
            doc=[]
            listp=soup.select('div.article-content > p')
            for j in range(len(listp)):
                #print(listp[j])
                pp=''
                for k in range(len(listp[j].contents)):
                    if(listp[j].contents[k].name=='span'):
                        pp+=listp[j].contents[k].text
                    elif(listp[j].contents[k].name=='b'):
                        pp+=listp[j].contents[k].span.text
                doc.append(pp)
            doc='
    '.join(doc)
            #print(doc)
    
    
            #用来截取input里的图片
            inputs=soup.find_all('input')
            imgs=''
            for k in range(len(inputs)):
                src='http://xcb.stdu.edu.cn/'
                img=src+inputs[k]['src']
                if(k!=0):
                    imgs+=' '+img
                else:
                    imgs+=img
            #用来截取img里的图片
            newimgs=soup.find_all('img')
            newimg=''
            for p in range(len(newimgs)):
                src = 'http://xcb.stdu.edu.cn/'
                imk=src+newimgs[p]['src']
                if (p != 0):
                    newimg += ' ' + imk
                else:
                    newimg += imk
            #获取的总图片
            url=imgs+' '+newimg
            #print(url)
    
            newvalue=(title,date,click,doc,url)
            newlist.append(newvalue)
    #数据库存储的实现
    tupnewlist=tuple(newlist)
    print(tupnewlist)
    db = pymysql.connect("localhost", "root", "fengge666", "baixiaosheng", charset='utf8')
    cursor = db.cursor()
    sql_news = "INSERT INTO tdnews values (%s,%s,%s,%s,%s)"
    sql_clean_news = "TRUNCATE TABLE tdnews"
    
    
    try:
        cursor.execute(sql_clean_news)
        db.commit()
    except:
        print('执行失败,进入回调1')
        db.rollback()
    
    try:
        cursor.executemany(sql_news,tupnewlist)
        db.commit()
    except:
          print('执行失败,进入回调3')
          db.rollback()
    db.close()
    View Code
  • 相关阅读:
    centos7 tar.gz zip 解压命令[转]
    centos7 下 安装visual studio code ,打开运行。
    yum提示Another app is currently holding the yum lock; waiting for it to exit...
    Linux CentOS7 安装
    虚拟机 centos7 的网络与电脑所在一个网络如何设置
    django创建web项目
    uwsgi Flask web.py
    MariaDB 与 MySQL 区别
    python pymysql 与 mysqlclient
    如何提高自己的象棋水平及象棋开局的五种忌讳
  • 原文地址:https://www.cnblogs.com/xiaofengzai/p/12709710.html
Copyright © 2011-2022 走看看