最近散事特别多,讨厌这种每天忙碌又迷茫的生活,一直想把这篇博客写了,前几天因为一直再弄一篇OpenCv的论文,还好能发了,今天刚抽出空就写写吧。

1、栏目dom分析

前几天有个医科学校做视频通话的项目,需要引入一些牙科相关的内容,如果手动去更新根本不可能,所以想引入一些网站上的内容,就查到了https://www.iyachi.com/这个网站,栏目在上面已经列出来,如牙周炎、牙龈肿痛等,经分析每个栏目的DOM结构都一样,以牙周炎分析为例,如下图:

文章列表全在一个类名为“category table table-striped table-bordered table-hover table-noheader”的table标签中,table下是tr标签,

tr标签下的td标签含有文章url和文章标题,同时含有阅读量信息。

页码结构如下,

页码信息在css类名为pagination的div中,ul标签下的li标签含有页码信息和页码的url地址,第1页是“/periodontitis.html?start=0*10”,第二页是“/periodontitis.html?start=1*10”,依次类推。第一个li是“开始”页,第二个li是“上一页”,最后一个li是“最后一页”,所以需要取页码列表的[2:-2].

2、栏目列表初始化

下面列出python代码结构

def __init__(self):self.url={"健康误区":"https://www.iyachi.com/jiankangwuqu.html","牙周炎":"https://www.iyachi.com/periodontitis.html","牙龈肿痛":"https://www.iyachi.com/swollengums.html","牙龈萎缩":"https://www.iyachi.com/gingivalrecession.html","牙龈出血":"https://www.iyachi.com/bleedinggums.html","牙齿松动":"https://www.iyachi.com/looseteeth.html","蛀牙":"https://www.iyachi.com/toothdecay.html","牙齿黄金":"https://www.iyachi.com/teethgold.html","好文共享":"https://www.iyachi.com/expertmonograph.html","爱牙活动":"https://www.iyachi.com/activity.html","爱牙推荐":"https://www.iyachi.com/","爱牙问答":"https://www.iyachi.com/wenda.html","爱牙新闻":"https://www.iyachi.com/news.html"}self.article_url_list=[]#文章列表self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}

以上是内容的初始化,不必多解释。

3、获取文章列表

for name,url in self.url.items():print('检测名字为"%s"的栏目'%(name))res_html=rq.get(url=url,headers=self.headers).content.decode("utf-8")res_data=etree.HTML(res_html)page_url_list=res_data.xpath('//div[@class="pagination"]//ul/li')[2:-2]#页码列表page_len=len(page_url_list)for i in range(page_len+1):page_url=url+"?start=%d"%(i*10)#某栏目的第i+1页self.getArticleList(page_url,name)#获取第i+1页的栏目名字为name文章列表

上面代码首先遍历栏目列表,然后根据栏目的url获取到每一个栏目的文章的列表,最后遍历文章列表,调用获得文章详情的方法来获取文章详情。

4、文章详情DOM分析

如下图,

文章内容在一个css类名为article-content clearfix的section标签里,可以通过xpath的string获取到,文章标题获取有两种方法:一是在文章列表中获得,即前面提到的tr标签里;二是在文章详情里,如下图,

标题在类名为article-title的h1标签里,本文说的代码里是通过文章列表里获取的。获取文章详情代码如下:

def getArticleContent(self,url):article_html=rq.get(url=url,headers=self.headers).content.decode("utf-8")article_every=etree.HTML(article_html)article_every_data=article_every.xpath('string(//section[@class="article-content clearfix"])').strip()return article_every_data

5、存至数据库

这部分不多讲解,直接上代码:

def insertData(self,articleName,articleContent,articleTitle,url):#print("检测名字为%s的栏目"%(articleName))#print("栏目地址%s"%(url))selectSql="select * from ARTICLE where article_url='%s'"%(url)#print(selectSql)db=pymysql.connect("192.168.1.8","root","test","IYACHI")cursor=db.cursor()cursor.execute(selectSql)if(cursor.rowcount!=0):print('文章名字为"%s"的文章已经存在,无需更新'%(articleTitle))else:print("即将存储……")insertSql="insert into ARTICLE(article_name,article_title,article_url,article_content) values ('%s','%s','%s','%s')"%(articleName,articleTitle,url,articleContent)#print(insertSql)cursor.execute(insertSql)db.commit()print ("【新文章提醒】这是一则新的文章,名称为《%s》,已为您更新到数据库" % (articleName))

6、总结

这个咨询详情的获取并不难,大约一上午就能搞定,这次就当是练练手了。想要做到页面上去,还需要用后端语言做数据接口,本文不在说明。最终结果如下:

完整代码如下:

 #_*_conding:utf-8_*_
"""
作者:liqq
作用:爬取http://iyachi.com的内容并存库
环境:python3.7
"""
import requests as rq
from lxml import etree
from bs4 import BeautifulSoup
import pymysql
class Iyachi(object):def __init__(self):self.url={"健康误区":"https://www.iyachi.com/jiankangwuqu.html","牙周炎":"https://www.iyachi.com/periodontitis.html","牙龈肿痛":"https://www.iyachi.com/swollengums.html","牙龈萎缩":"https://www.iyachi.com/gingivalrecession.html","牙龈出血":"https://www.iyachi.com/bleedinggums.html","牙齿松动":"https://www.iyachi.com/looseteeth.html","蛀牙":"https://www.iyachi.com/toothdecay.html","牙齿黄金":"https://www.iyachi.com/teethgold.html","好文共享":"https://www.iyachi.com/expertmonograph.html","爱牙活动":"https://www.iyachi.com/activity.html","爱牙推荐":"https://www.iyachi.com/","爱牙问答":"https://www.iyachi.com/wenda.html","爱牙新闻":"https://www.iyachi.com/news.html"}self.article_url_list=[]self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}def main(self):for name,url in self.url.items():print('检测名字为"%s"的栏目'%(name))res_html=rq.get(url=url,headers=self.headers).content.decode("utf-8")res_data=etree.HTML(res_html)page_url_list=res_data.xpath('//div[@class="pagination"]//ul/li')[2:-2]#页码列表page_len=len(page_url_list)for i in range(page_len+1):page_url=url+"?start=%d"%(i*10)#某栏目的第i+1页self.getArticleList(page_url,name)#获取第i+1页的栏目名字为name文章列表def getArticleList(self,url,name):data={}article_tr=rq.get(url=url,headers=self.headers).content.decode('utf-8')article_tr_html=etree.HTML(article_tr)article_tr_list=article_tr_html.xpath("//table[@class='category table table-striped table-bordered table-hover table-noheader']//tr")for article_tr in article_tr_list:if article_tr.xpath("./td[1]/a/@href"):article_title=article_tr.xpath("./td[1]/a/text()")[0].strip()#print(article_title)article_url="http://iyachi.com"+article_tr.xpath("./td[1]/a/@href")[0]#self.article_url_list.append(article_url)#这里是文章列表article_content=self.getArticleContent(article_url)data["article_name"]=namedata["article_title"]=article_tr.xpath("./td[1]/a/text()")[0].strip()data["content"]=article_content.strip()data["article_url"]=article_url#print(data)self.insertData(data["article_name"],data["content"],data["article_title"],data["article_url"])def getArticleContent(self,url):article_html=rq.get(url=url,headers=self.headers).content.decode("utf-8")article_every=etree.HTML(article_html)article_every_data=article_every.xpath('string(//section[@class="article-content clearfix"])').strip()return article_every_datadef insertData(self,articleName,articleContent,articleTitle,url):#print("检测名字为%s的栏目"%(articleName))#print("栏目地址%s"%(url))selectSql="select * from ARTICLE where article_url='%s'"%(url)#print(selectSql)db=pymysql.connect("192.168.1.8","root","test","IYACHI")cursor=db.cursor()cursor.execute(selectSql)if(cursor.rowcount!=0):print('文章名字为"%s"的文章已经存在,无需更新'%(articleTitle))else:print("即将存储……")insertSql="insert into ARTICLE(article_name,article_title,article_url,article_content) values ('%s','%s','%s','%s')"%(articleName,articleTitle,url,articleContent)#print(insertSql)cursor.execute(insertSql)db.commit()print ("【新文章提醒】这是一则新的文章,名称为《%s》,已为您更新到数据库" % (articleName))#print(cursor.fetchone())#print(cursor.rowcount)def cursor(self):db=pymysql.connect("192.168.1.8","root","test","IYACHI")cursor=db.cursor()return cursor#if __name__=="__main__":
iyachi=Iyachi()
iyachi.main()

有问题请联系:邮箱:541095024@qq.com

python爬虫初探,爬取我爱牙齿网,存取内容相关推荐

  1. Python爬虫:爬取我爱我家网二手房源信息

    # xpath爬取 # 爬取小区名称.户型.地区.售价.总价 1.导入模块 import requests import csv from lxml import etree 2.创建类 # 创建我爱 ...

  2. Python爬虫项目实例——爬取【乐彩网】双色球历史获奖红蓝球数据

    爬取[乐彩网]双色球历史获奖红蓝球数据 最终存到excel中 爬取数据要求为: 代码如下: import requests from lxml.html import etree import rec ...

  3. python中国大学排名爬虫写明详细步骤-Python爬虫——定向爬取“中国大学排名网”...

    内容整理自中国大学MOOC--北京理工大学-蒿天-Python网络爬虫与信息提取 相关实战章节 我们预爬取的url如下 网页节选 在浏览器中读取网页源代码 可以 发现表格数据信息是直接写入HTML页面 ...

  4. python爬虫之爬取《贵州农经网》信息

    前言:期待已久的科研项目终于有眉目了,这是第一次去找研究生老师做项目,由于时间关系,老师没能给我安排上任务,叫我和一个研究生学长交接工作.第一个叫我解决的网站就是<贵州农经网>,由于有一个 ...

  5. AJAX教程美食滤镜,Python爬虫实例——爬取美团美食数据

    1.分析美团美食网页的url参数构成 1)搜索要点 美团美食,地址:北京,搜索关键词:火锅 2)爬取的url https://bj.meituan.com/s/%E7%81%AB%E9%94%85/ ...

  6. python爬取ajax动态内容肯德基门店,Python爬虫如何爬取KFC地址

    随着人们生活水平的提高,肯德基这类的快餐消费的十分火爆,成为小朋友和年轻人的最爱,我们到一个地方想要找到肯德基店面,会根据导航获取肯德基地址,那你知道我们也可以使用python爬虫获取KFC地址吗?我 ...

  7. python可以爬取的内容有什么_Python爬取视频(其实是一篇福利)过程解析 Python爬虫可以爬取什么...

    如何用python爬取视频网站的数据 如何用python爬取js渲染加载的视频文件不是每个人都有资格说喜欢,也不是每个人都能选择伴你一生! 有哪位大神指导下,有些视频网站上的视频文件是通过 js 加载 ...

  8. python爬取网页表格数据匹配,python爬虫——数据爬取和具体解析

    标签:pattern   div   mat   txt   保存   关于   json   result   with open 关于正则表达式的更多用法,可参考链接:https://blog.c ...

  9. Python爬虫:爬取instagram,破解js加密参数

    Python爬虫:爬取instagram,破解js加密参数 instagram 是国外非常流行的一款社交网站,类似的还有像facebook.twitter,这些社交网站对于掌握时事热点.电商数据来源和 ...

最新文章

  1. Tomcat虚拟路径
  2. 使用RSClientPrint直接打印本地RDLC报表
  3. 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中
  4. 使用CoreImage教程
  5. ie8 的断字/断行 bug
  6. ajax send()的作用_AJAX(Asynchronous JavaScript And XML)
  7. 苹果手机绕激活锁之亲身体验
  8. linux中查看rpm包位置,linux中,查看某个命令是来自哪个RPM包或者是通过哪个RPM包安装的...
  9. 3dmax安全工具3ds Max Scene Security Tools
  10. 优思学院|六西格玛:如何最有效地制定目标?
  11. python逢七拍手游戏_Python小游戏:乱点鸳鸯谱生成七言绝句
  12. 【C语言】形参实参以及参数传递
  13. element-plus popover的z-index问题
  14. ajaxpro安装和使用---有人说ajaxpro是ajax的替代品
  15. html中编辑广告位,广告位(banner)的可视化管理后台逻辑说明
  16. 2008 r2 server sql 中文版补丁_Microsoft SQL Server 2008 R2 SP1补丁 64位 官方免费版(附安装教程)...
  17. STM32 USB AUDIO 基础篇①——通过STM32CubeMX生成USB Speaker音频播放Demo(史上最简单)
  18. b站python直播批量发送弹幕_Python实现自动发送B站直播弹幕软件
  19. 应对不确定性的一个有效手段是重塑企业的使命、愿景和价值观。
  20. vertx编程需注意的点

热门文章

  1. 电脑文件名颜色有一些变成蓝色或者绿色
  2. 2018整理最全的100道Redis面试题!转自(风云社区:www.scoee.com)
  3. android WebView 读取sdcard 上 html 报 net:err_access_denied
  4. h5 如何录音保存上传_原生h5实现录音和录视频
  5. office2016设置outlook登录263邮箱步骤
  6. 我的运维开发生涯-网络设备指标告警实现
  7. 做好APP营销,APP命名的三原则分享
  8. citavi 入门选手-篇章1
  9. jQuery中的四种事件监听方式
  10. 无监督学习-关联分析apriori原理与python代码