编程学习网 > 编程语言 > Python > python简单的爬虫教程( 基于python的简单爬虫入门)
2023
05-18

python简单的爬虫教程( 基于python的简单爬虫入门)


可能很多人都听说过爬虫,也有一些人能够熟练的使用(膜拜大佬),在本文,小编将对爬虫进行简单的介绍,并帮助基础较差的童鞋进行简单的入门。

首先,来看看什么是爬虫。

俗话说得好,不想偷懒的小编不是好小编(每一只优秀的小编都是优秀的知识搬运工),咱们来看看百度百科对于爬虫的定义:

好啦,现在我们对于爬虫有了简单的了解,下面本文将以爬取中传要闻为例,对如何使用python爬虫爬取网页的数据和如何将数据存入数据库进行讲解。
基于workbench的数据库简单操作
这里先介绍数据库的使用。小编使用MySQL workbench进行可视的数据处理。workbench是MySQL的一款图形操作软件,可以让没有sql基础的童鞋也能快速上手。当然,想玩的熟练还是要学一下sql语句啦。
首先是下载MySQL和workbench,大家搜索MySQL去其官网即可下载安装,网上教程也有很多,这里就不再赘述啦(偷懒+2)。
打开workbench,点击下图的小加号,进行数据库创建。

创建界面如下,大家按照下图操作即可。如果忘了你的数据库密码,可以百度MySQL数据库密码重置,有教程的哦(偷懒+3图片)。
大家需要做的主要是填写名称,然后ok即可。数据库会采用root的默认密码。

进入你创建的数据库后,在SCHEMAS的目录的下方空白处,右键选择新建表(create schema),填写名称,应用即可。
在你新建的表中,右键Tables选择新建table(最终的数据存储的地方),根据需要进行表头和数据格式的填写。小编在下图为大家简单介绍一些按钮选项。

我们设置一个主键即可,根据你要爬取的数据,将中文数据的对应列的格式设置为utf8,并且对于文本较长的列,可以将字符长度设置的高一点,不然在程序运行中会报错的哦。
另外,数据库的设置可以根据你的爬虫去修改。修改时,对相应的table右键选择Truncate table,即可删除数据库已经存入的数据,避免脏库。查看数据库时,可以右键选择表格图形,即可预览。
以上,都无需sql语言即可完成,但是小编还是建议大家去学习一下,可以去B站上课,也可以直接学习文档,成为大佬,从你做起图片。
基于python的爬虫编写
好了,我们现在建好了库,就可以编写爬虫了。本次任务为从网站中传要闻上爬取所有新闻的题目,网址,已经每一篇新闻的发布部门,发布时间,浏览量,文本和图片链接,任重道远啊。
导包
首先进行导包,安装这些包可以在cmd运行pip install XX,即可。其中,requests访问网页需要用到;re为正则表达式的包,用于后期的文字处理;pymysql用于将数据存入数据库;bs4用于解析网页。
import requests
import re 
import pymysql
from bs4 import BeautifulSoup as bs
定义存储数据函数
功能为将爬取数据存入上一步建好的数据库中。
# 将数据存入数据库
def savenews(title,url,department,publishdate,count,content,piclinks):
    #pysql.connect(数据库URL,用户名,密码,数据库名)
    db = pymysql.connect(host="127.0.0.1", user="root", passwd="123456", db="cucnews", port=3306,charset="utf8")
    cursor = db.cursor()
    try:
        cursor.execute('INSERT INTO news2(title,url,department,publishdate,count,content,piclinks) VALUES(%s,%s,%s,%s,%s,%s,%s)', (title,url,department,publishdate,count,content,piclinks))
        db.commit()
    except Exception as e:
        print('1错误类型是',e.__class__.__name__)
        print('错误明细是',e)
        db.rollback()
    db.close()
定义爬取信息的函数
我们先登录至需要爬取的网站,中传要闻。网址:http://www.cuc.edu.cn/news/1901/list1.htm
如下图:

子新闻网址规律
在网页的最下方,可以看到当前网站共584页(日后还会更新),我们要做的,便是进入各个子链接,获得文本信息。
编写爬虫,是基于所有网站都是人写出来的,而且都是偷懒写出来的,所以网站一定是有规律的。点击下一页,发现网址的list后增加了数字2,再点击下一页,为list3,发现规律:这些网址是在list后递增数字完成的。由此,我们得到了基础网址的变化规律。
爬取新闻标题和新闻url(网址)
我们在中传要闻的第一页,对第一篇新闻右键标题,选择检查,可以发现其属性类别。结果如下:

红色框圈出来的是我们需要的信息,主要是紫色的h3和a,h3的意思是三级标题,a是HTML的一种标签,大家把他理解为一种目录就可以了,其后一般跟链接,有兴趣的小伙伴可以参考文档https://www.w3school.com.cn/html5/tag_a.asp
那么子新闻的网址就是http://www.cuc.edu.cn/news/2021/0326/c1901a179179/page.htm
即为http://www.cuc.edu.cn+href后的内容。由此得到子新闻的网址规律。
我们使用如下代码对其进行爬取(这段代码没有使用正则表达式,里面的re为requests,其他代码的re为正则):
from bs4 import BeautifulSoup as bs
import requests as re
url0='http://www.cuc.edu.cn/news/1901/list'
for i in range(1,584):
    url=url0+str(i)+".htm"
    print(url)
    r=re.get(url)
    rt=r.content
    rh=str(rt,"utf-8")
    soup=bs(rh,"html.parser")
    title=soup.find_all("h3",attrs={'class','tit'})
    for t in title:
        newsurl=t.find_all('a')
        urllen=str(newsurl[0]).find("target") #find返回第一次发现字符串的下标,用于定位
        tit=t.get_text()
        url='http://www.cuc.end.cn'+(str(newsurl[0])[9:urllen-2])
        print(newsurl)
        print(url)
        print(tit)
    db.close()
代码的思想为:
基于主网站的规律对网址进行拼接,然后对所有页面进行遍历。使用requests包获取网站信息,并用soup进行采集。其中理解上有困难的为倒数第五行:
url='http://www.cuc.end.cn'+(str(newsurl[0])[9:urllen-2])
这段代码的功能其实是获取子新闻的url,newsurl获取的是<a herf>后的值,其网址为从第10个字符开始,到倒数第二个,也就是[9:urllen-2]
好,我们现在已经会爬取新闻标题和网址了图片。
爬取新闻发布部门,发布时间和文本信息
和爬取新闻标题异曲同工,对于小编这个比较菜的人来说,右键“检查”无敌图片。
我们在具体网页内,右键检查我们想要爬取的信息,获取它的网页属性,然后使用soup进行捕捉。

基于上述逻辑,我们定义爬取网页信息的函数:
def parsecontent(newsurl):
    try:
        r = requests.get(newsurl) #获取网站返回内容
        rt = r.content # 获取文本
        rh = str(rt,"utf-8") #转为字符串,utf8格式
        soup = bs(rh,"html.parser") #使用soup获取

        #新闻标题
        h1 = soup.find_all("h1") #获取新闻标题h1
        #检查时发现信息内容为arti-name,见上图
        info = soup.find_all("span",attrs={"class":"arti-name"})
        infotxt = info[0].get_text()       
        department = infotxt[infotxt.find('来源:')+3:infotxt.find('20')] #发表部门
        newsdate = infotxt[infotxt.find('20'):infotxt.find('20')+10] #发表日期
        rn = re.compile('[\u4e00-\u9fa5]+')#正则表达式为取中文,可以去掉回车
        dep = rn.findall(department)

        countinfo = soup.find_all("span",attrs={"class":"WP_VisitCount"})
        count = countinfo[0].get_text()
        # 将图片地址插入piclinks
        all_image = soup.find("article",attrs={"class":"con-area"}).find_all('img')
        piclinks = ''
        for i in range(len(all_image)):
            if all_image[i] != '':
                link = 'http://www.cuc.edu.cn/_upload/'+str(all_image[i])[str(all_image[i]).find('src="')+14:str(all_image[i]).find('.')+4]
                piclinks = piclinks + link + ' '

        contentinfo = soup.find_all("div",attrs={"class":"wp_articlecontent"})
        content = contentinfo[0].get_text()

    except:
        return 0,0,0,0,0
    return dep[0],newsdate,count,piclinks,content

    db.close()
我在代码里写了详尽的注释,有助于帮助大家理解。
另外对一些代码做一下解释。
使用try,except是为了防止个别网站有问题而使程序报错停止,因为有一些文章是从微信复制过来的,其格式,规律就和上述不同了,一般都会报错。而try,except可以将其跳过,继续运行。
代码中多次使用了find()函数,其功能为返回查找字符串的索引。因为我们要将一大串文本分成多个我们需要的数据,使用索引进行定位。
可以发现,本文所使用的爬虫主要就是使用soup获取数据,使用find()定位,然后利用字符串拼接获取数据完成的。
主程序
我们将上述几段代码整合,先访问所有的新闻页面,然后在每一个子新闻页面获取相应信息,并存储至数据库中。代码如下:
urlpath="http://www.cuc.edu.cn/news/1901/list"
try:
    for i in range(1,584):
        url=urlpath+str(i)+".htm"
        #print(url)
        r=requests.get(url)
        code=r.encoding
        content=r.content
        rt=str(content,"utf-8")
        soup=bs(rt,"html.parser")
        href=soup.find_all("h3",attrs={'class','tit'})
        for h in href:
            newsurl=h.find_all('a')
            urllen=str(newsurl[0]).find('target')
            newsurl=str(newsurl[0])[9:urllen-2]
            newsurl="http://www.cuc.edu.cn"+newsurl
            title=h.get_text()
#             print(title) 
#             print("------Save Start!---------")
            department,date,count,piclinks,content = parsecontent(newsurl)
            savenews(title,newsurl,department,date,count,content,piclinks)
#             print("------Save Sucess!---------")
            #savenews(title,newsurl)
        print(i)
except Exception as e:
    print('3错误类型是',e.__class__.__name__)
    print('错误明细是',e)
可以看到数据库已经存入了相应信息!

对于这些信息,我们可以进行词频统计制作词云图,或者使用别的方法去处理你想要的信息!
以上就是python简单的爬虫教程( 基于python的简单爬虫入门)的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。


扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取