可能很多人都听说过爬虫,也有一些人能够熟练的使用(膜拜大佬),在本文,小编将对爬虫进行简单的介绍,并帮助基础较差的童鞋进行简单的入门。
首先,来看看什么是爬虫。
俗话说得好,不想偷懒的小编不是好小编(每一只优秀的小编都是优秀的知识搬运工),咱们来看看百度百科对于爬虫的定义:
好啦,现在我们对于爬虫有了简单的了解,下面本文将以爬取中传要闻为例,对如何使用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教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/10989/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料