Python爬虫几个步骤教你写入mysql数据库
Python爬虫几个步骤教你写入mysql数据库
Python爬虫实现爬取网站中的数据并存入MySQL数据库中,在爬取的时候总要涉及到数据持久化存储,当然有很多中存储的方式,简单点的有excel、txt、json、csv等等。存入mysql我觉的有好多操作空间,如果是开发python后端也可以熟悉一下sql语句,存入数据库的方法也是试了些许网上一些方法,现在把完整功能供大家参考。
直接搜索phpStudy安装即可,按照下图配置数据库。用户名密码自行设置,然后返回首页启动即可。
pipinstallpymysql
打开刚安装的phpstudy安装一个mysql客户端连接,数据库是本地的host可以填127。0。0。1或localhost用户名密码是上面设置的
MySQL创建对应的表CREATETABLEtextarchives(idint(10)UNSIGNEDNOTNULLAUTOINCREMENTCOMMENTID,urlvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4unicodeciNOTNULLDEFAULTCOMMENT链接,titlevarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4unicodeciNOTNULLDEFAULTCOMMENT标题,imagevarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4unicodeciNOTNULLDEFAULTCOMMENT图片,keywordsvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4unicodeciNOTNULLCOMMENT关键描述,descriptionvarchar(600)CHARACTERSETutf8mb4COLLATEutf8mb4unicodeciNOTNULLDEFAULTCOMMENT内容描述,contenttextCHARACTERSETutf8mb4COLLATEutf8mb4unicodeciNULLCOMMENT内容,weighint(10)NOTNULLDEFAULT0COMMENT权重,createtimebigint(16)NOTNULLDEFAULT0COMMENT创建时间,updatetimebigint(16)NOTNULLDEFAULT0COMMENT更新时间,deletetimebigint(16)NULLDEFAULTNULLCOMMENT删除时间,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBAUTOINCREMENT2692CHARACTERSETutf8mb4COLLATEutf8mb4unicodeciCOMMENT内容表ROWFORMATDynamic;SETFOREIGNKEYCHECKS1;
构造SQL语句的字符串sql,然后通过cursor。excute(sql)执行,下面简单的封装,直接复制即可用。importpymysqlclassMysql(object):definit(self):self。connectpymysql。connect(host127。0。0。1,usertest,password,databasetest,charsetutf8mb4,cursorclasspymysql。cursors。DictCursor)self。cursorself。connect。cursor()definsetdb(self,tablename,insertdata):try:dataself。getmysqldata(datainsertdata)fieldsdata〔0〕valuesdata〔1〕sqlINSERTINTO{tablename}({fields})values({values})。format(tablenametablename,fieldsfields,valuesvalues)self。cursor。execute(sql)self。connect。commit()exceptExceptionase:self。connect。rollback()如果这里是执行的执行存储过程的sql命令,那么可能会存在rollback的情况,所以这里应该考虑到print(数据插入失败,失败原因:,e)print(insertdata)else:self。dbclose()returnself。cursor。lastrowiddefupdatedb(self,tablename,updatedata,wheresNone):try:ifwheresisnotNone:sqlUPDATE{tablename}SET{updatedata}WHERE{wheres}。format(tablenametablename,updatedataupdatedata,whereswheres)else:sqlUPDATE{tablename}SET{updatedata}。format(tablenametablename,updatedataupdatedata)self。cursor。execute(sql)self。connect。commit()exceptExceptionase:print(更新失败:,e)returnFalseelse:self。dbclose()returnTruedefdeletedb(self,tablename,wheres):try:构建sql语句sqlDELETEFROM{tablename}WHERE{wheres}。format(tablenametablename,whereswheres)self。cursor。execute(sql)self。connect。commit()exceptExceptionase:print(删除失败:,e)returnFalseelse:self。dbclose()returnTruedefselectdb(self,tablename,fields,wheresNone,getoneFalse):try:ifwheresisnotNone:sqlSELECT{fields}FROM{tablename}WHERE{wheres}。format(fieldsfields,tablenametablename,whereswheres)else:sqlSELECT{fields}FROM{tablename}。format(fieldsfields,tablenametablename)self。cursor。execute(sql)self。connect。commit()ifgetone:resultself。cursor。fetchone()else:resultself。cursor。fetchall()exceptExceptionase:print(查询失败,e)returnNoneelse:self。dbclose()returnresultdefgetmysqldata(self,data):fieldsinsertdatafork,vindata。items():fieldsfieldsk,insertdatainsertdatastr(v),fieldsfields。strip(,)insertdatainsertdata。strip(,)return〔fields,insertdata〕defdbclose(self):self。cursor。close()self。connect。close()
这次简单点咱们用xpath就行,有一个小技巧咱们在爬取的网页打开开发都模式F12。如下图红框复制第一个或都第二个就行。
下面代码是实现爬取数据然后存入数据库类,大家可参考frommodel。navimportNavimportrequestsfromurllibimportparsefromlxmlimportetreefromfakeuseragentimportUserAgentfromlib。reptileimportReptileimportjsonclassCommon(object):definit(self,params):self。urlparams〔url〕self。paramsparamsself。blog1defgetheader(self):uaUserAgent()headers{UserAgent:ua。random}returnheadersdefgethtml(self,url):在超时间内,对于失败页面尝试请求三次ifself。blog3:try:resrequests。get(urlurl,headersself。getheader(),timeout3)res。encodingres。apparentencodinghtmlres。textreturnhtmlexceptExceptionase:print(e)self。blog1self。gethtml(url)defjsoninsertdata(self,params):categoryidself。insertcategory(cnameparams〔categoryname〕,pidparams〔pid〕,icon)print(分类插入成功:{}。format(params〔categoryname〕))ifcategoryid:urlparams〔url〕titleparams〔title〕imageparams〔image〕descriptionparams〔description〕keywordsparams〔keywords〕contentparams〔content〕self。insertarchives(categoryid,url,title,image,description,keywords,content)print(内容插入成功:{}。format(title))print()defgetitem(self,xpathhtml):itemlistxpathhtml。xpath(self。params〔itemxpath〕)print(itemlist)forrowinitemlist:urllistrow。xpath(self。params〔urlxpath〕)iflen(urllist)0:self。getcontent(urllist〔0〕)defgetcontent(self,url):print(正在抓取链接:{}。format(url))domainparse。urlparse(url)。netlocddomainparse。urlparse(self。url)。netlocifdomainddomain:htmlself。gethtml(url)self。reptile。blog1ifhtml:petree。HTML(html)titleself。getconmoncontent(p,self。params〔titlexpath〕)print(标题为:{}。format(title))categorynameself。getconmoncontent(p,self。params〔categoryxpath〕)print(分类为:{}。format(categoryname))imageself。getconmoncontent(p,self。params〔imagexpath〕)print(图片为:{}。format(image))linkself。getconmoncontent(p,self。params〔linkxpaht〕)print(链接为:{}。format(link))descriptionself。getconmoncontent(p,self。params〔descriptionxpath〕)print(描述为:{}。format(description))keywordsself。getconmoncontent(p,self。params〔keywordsxpath〕)print(关键描述:{}。format(keywords))contentself。getconmoncontent(p,self。params〔contentxpath〕)print(内容为:{}。format(content))params{pid:158,title:title,categoryname:categoryname,image:image,url:link,description:description,keywords:keywords,content:content,}iftitleandcategorynameandlink:self。jsoninsertdata(params)存入数据库defgetconmoncontent(self,xpathhtml,xpath):contentlistxpathhtml。xpath(xpath)contentiflen(contentlist)0:contentcontentlist〔0〕。strip()returncontentdefrun(self):print(url:{}。format(self。url))htmlself。gethtml(self。url)ifhtml:petree。HTML(html)self。getitem(p)爬取的xpathparams{url:https:www。widiz。com,爬取urlurlxpath:。a〔1〕href,titlexpath:htmlbodyp〔1〕p〔2〕p〔3〕pp〔3〕ph1text(),categoryxpath:htmlbodyp〔1〕p〔2〕p〔3〕pp〔3〕pa〔1〕text(),imagexpath:htmlbodyp〔1〕p〔2〕p〔3〕pp〔2〕pimgsrc,linkxpaht:htmlbodyp〔1〕p〔2〕p〔3〕pp〔3〕ppp〔1〕spanahref,descriptionxpath:htmlheadmeta〔10〕content,keywordsxpath:htmlheadmeta〔5〕content,contentxpath:htmlbodyp〔1〕p〔2〕p〔3〕mainp〔1〕pp〔1〕pp〔2〕text()}Common(params)。run()
最终效果:
发券让利上新成都年末消费活力足消费是经济增长的持久动力,日前召开的中央经济工作会议将着力扩大国内需求作为明年经济工作首要任务,并敲定了具体路线。发放文旅惠民畅游券举行系列美食体验活动推出超亿元消费让利元旦春节将
年糕带你环游世界第三十站厄瓜多尔目的地名称厄瓜多尔共和国目的地位置南美洲北部国土面积25。6万平方公里首都基多主要民族印欧混血种人印第安人白种人穆拉托人黑种人国旗厄瓜多尔共和国国旗长宽比为21,国旗底色为黄色红色
文旅复苏,西安如何打好IP王炸?近日,长安十二时辰大唐不夜城唐文化全景展示创新实践项目成功入选文化和旅游部2022年度文化和旅游最佳创新成果。随着政策的调整和经济的复苏,西安的文旅产业也将迎来新的发展机遇。文旅产
冬日傲雪平庆美的惊人!冬天一到,大家是不是就准备猫冬了对于没有经历过华丽冬日的人来说每一个冬季都极其平庸看着外面萧瑟的景象你的身体是不是是不是日渐懒惰了你知道完美的冬季藏在哪里吗完美的冬季,藏在诗和远方
八条通道!重庆发布飞鸟猛禽迁徙行踪随着气温逐渐降低,又到了候鸟越冬的季节。近日,市林业局首次发布重庆候鸟迁徙路线示意图,这些远道而来的贵客,将在重庆经历一段什么样的旅程?一起来看看。在本次发布的重庆候鸟迁徙路线示意
塞舌尔地球上最后的伊甸园,一个适合退休养老的天堂岛国15世纪初,郑和率领庞大的船队7次下西洋,当船队航行到东非海岸时,在肯尼亚东北部海滨的拉穆群岛遗留了一批中国古代瓷器,见证了历史上海路的交流。而郑和船队在到达东非前,应该会途径一处
玩转武夷阳康们做好准备,这场旅行一定要还给自己!阳康之后的第一件事一定是去旅行!去大口呼吸新鲜的空气!爱上旅行的原因有很多有人是为了拍摄美好风景有人是为了寻觅舌尖上的美食有人是为了探索自然的奥秘有人是为了远离城市度个假而已那么,
逛摩洛哥海鲜市场,发现世界上最会烹饪海鲜的还得是东亚人全球之旅我在摩洛哥大家好,我是申典启,一个实地走访世界各地,关注全球华人的旅行者。抵达摩洛哥北部城市,丹吉尔。1,丹吉尔老城,主色调白色在丹吉尔待了四天,说实话整个老城非常小,几乎
乾隆退位时不愿交出玉玺,刘墉在他耳边说了8个字,他立马交出乾隆是我国历史上著名的长寿皇帝,在皇帝的平均年龄只有39岁的封建社会,他活了88岁,难怪他会自称为十全老人,用来炫耀自己的高寿。原本他可以成为我国历史上在位时间最长的皇帝,但是在他
1962年印度战败后,出兵占领了一块尼泊尔领土印度是南亚地区最大的国家,分别和我国巴基斯坦孟加拉国等多个国家接壤,首都为新德里。印度和巴基斯坦孟加拉国,历史上都是英属印度的一部分,1947年印巴分治后,印度继承了英属印度大部分
为何杭州财政收入可以排名全国省会城市第一位!如果说GDP只是字面上的广义国民生产总值,而财政收入才是货真价实的实力担当,扛把子。举一个简单例子,如果说GDP是销售收入,那么说财政收入就是净利润,它才是真正的中流砥柱。如图所示