智能采集组合文章(如何获取对应节点下的数据节点?有哪些注意事项? )

优采云 发布时间: 2021-09-12 23:00

  智能采集组合文章(如何获取对应节点下的数据节点?有哪些注意事项?

)

  连接数据库,本文以MySQL为例

  创建文件caijiMySQL.py并连接数据库,代码如下:

  import pymysql

def mysql_connect():

db = pymysql.connect(host='数据库地址', port=3306, user='数据库账户', passwd='数据库密码', db='数据库名', charset='utf8')

return db.cursor()

  为采集网站信息创建caijiweb.py文件,本文以采集河南省教育部教师招聘信息为例,网址如下:

  

  解析所需采集对象的HTML节点

  右击查看元素,或者按F12,可以查看当前页面的HTML元素。然后我们将分析采集的数据节点。

  

  如上图所示,我们以第一条消息为例。我们需要的采集是class="list"标签下的信息,标题,链接,添加时间。之后需要进入这个页面,如下图:

  

  如上图所示,我们进入后,同样可以得到信息标签,例如class="det"就是招聘内容。

  如何获取对应节点下的信息?

  这里需要用到beautifulsoup,一个俗称美味汤的爬虫库。这个类的详细用法这里就不介绍了,大家可以参考前面的文章,可以通过各种组合快速选择自己需要的内容。

  有哪些注意事项?

  1、翻页:上面第一张截图,内容页数多,需要翻页

  2、采集 过程中,有很多无用的信息,需要过滤。比如我需要采集大学直播老师的信息,其他的没用,不需要额外的存储浪费空间。

  3、数据库存储

  4、页面应根据存储特性进行翻译,例如“转入”,以便存储后在其他地方检索和使用。

  具体代码如下(有详细说明)

  from bs4 import BeautifulSoup

from caijiMySQL import mysql_connect

# 引入第一步建立的数据库连接文件

import requests

#用于模拟网站请求

import re #用于选择标签时的,正则选择

import time

#时间类

cursor = mysql_connect()

# 执行数据库连接

sql = "select insert_time from me_article limit 1"

values =cursor.execute(sql)

values = cursor.fetchall()

current_time = values[0][0]

#查一下最后一条插入的招聘信息是什么时间的,采集时,只采集这个时间点之后的数据。

def caiji_jiaoyu(url):

wb_data = requests.get(url) #使用get方式获取页面内容

wb_data.encoding = 'utf-8' #页面编码为utf-8

soup = BeautifulSoup(wb_data.text, 'lxml') #使用美味汤进行分析性

for child in soup.find_all('a',attrs={"target": "_blank"}): #获取页面所有链接

article_html = requests.get(child['href']) #获取链接子页面内容

re = article_html.status_code #子页面获取的状态,看是否获取成功

if re == 200:

article_html.encoding = 'utf-8'

article_detail = BeautifulSoup(article_html.text, 'lxml')#分析子页面

article_title= child.get_text()

sql = "select * from me_article where article_name = %s"

cursor.execute(sql, article_title)

values = cursor.fetchall() #查看是否已存在该招聘信息

if values == ():

result_a = article_title.find('学院')

result_b = article_title.find('大学')

result_c = article_title.find('学校')

result_d = article_title.find('中学')

result_e = article_title.find('中心')

result_f = article_title.find('研究室')

result = 0

if result_a != -1:

result = result_a

if result_b != -1:

if result < result_b:

result = result_b

if result_c != -1:

if result < result_c:

result = result_c

if result_d != -1:

if result < result_d:

result = result_d

if result_e != -1:

if result < result_e:

result = result_e

if result_f != -1:

if result < result_f:

result = result_f

if result_a or result_b or result_c or result_d or result_e or result_f:# 筛选出大学招聘信息

sql = "select * from me_school where school_name = %s"

cursor.execute(sql,article_title[0:result+2])

values = cursor.fetchall()

if values != ():

school_id = values[0][0]

else:

sql = "insert into me_school(id, school_name) values (%s, %s)" #插入数据库

insert_result=cursor.execute(sql, ('', article_title[0:result+2]))

if insert_result == 1:

sql = "select * from me_school where school_name = %s"

cursor.execute(sql, article_title[0:result + 2])

values = cursor.fetchall()

if values != ():

school_id = values[0][0]

else:

school_id = 2

db.commit()

article_time = article_detail.find("span",class_="time").get_text("|", strip=True)

timeArray = time.strptime(article_time, "%Y-%m-%d %H:%M:%S")

article_time = int(time.mktime(timeArray))

if article_time < current_time:#如果发布时间比采集到的世界早,说明已经采集过了,是过时信息,跳出循环

exit()

article_content_in = article_detail.select('.det')

article_content_in_str = "".join('%s' % id for id in article_content_in)

article_content = article_content_in_str.replace("'", "'")

sql = "insert into me_article (school_id,article_name,article_content,article_url,article_time,insert_time) values (%s,%s,%s,%s,%s,%s)"

cursor.execute(sql, (str(school_id), article_title, '<p>' + article_content + '',child['href'], article_time, time.time()))

db.commit()

#下方几行代码,为获取下一页链接,然后重复执行上面采集内容。一般是只在第一次采集时候使用。

# if soup.find_all("a",text="下一页") != []:

# next_url = soup.find_all("a", text="下一页")[0].get('href').replace("tzgg", "/")

# url = 'http://www.haedu.gov.cn/jszp/' + next_url

# caiji_jiaoyu(url)

caiji_jiaoyu("http://www.haedu.gov.cn/jszp/index.html")

#执行采集</p>

  采集 结果如下图所示:

  

  注意,以上部分代码是博客编辑时添加的注释。如果直接复制测试,请注意空格。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线