简单的新闻内容获取
1、网址:http://www.mot.gov.cn/jiaotongyaowen/index.html,只爬取第一页内容
2、确定所需内容,提前写好xpath格式进行匹配
3、所需模块如下,都用 pip3 install 模块名
4、小白,初次写博客,多多包涵,互相学习
import pymysql
import random
import time
import requests
import datetime
from lxml import etree
from useragents import ua_list
4、接下来建立一个类(简单的爬虫框架)
class News1(object):
def __init__(self):
# 定义所需的变量,如:爬去地址,请求头,若要将数据保存在数据库,则
# 链接数据库,创建游标
# 获取html功能函数
def get_html(self):
# 解析函数 - 得到各个新闻链接
def parse_html(self):
# 二级获取HTML内容
def get_html2(self,url1):
# 爬取数据之前先到数据库中查询比对
def is_go_on(self,title):
# 保存数据
def save_news(self,title,fromWhere,datetime,content):
def run(self):
self.get_html()
self.parse_html()
if __name__ == '__main__':
start = time.time()
s = News1()
s.run()
end = time.time()
print('运行时间:{}'.format(end-start))
5、实际操作,导包、访问地址,伪装请求头,链接数据库;然后将访问地址的所有内容返回成字符串的形式
import pymysql
import random
import time
import requests
import datetime
from lxml import etree
from useragents import ua_list
class News1(object):
def __init__(self):
self.url = 'http://www.mot.gov.cn/jiaotongyaowen/'
self.headers = {'User-Agent': random.choice(ua_list)}
self.db = pymysql.connect('IP地址', '用户', '密码', '库名', charset='utf8')
self.cur = self.db.cursor()
# 获取html功能函数
def get_html(self):
html = requests.get(url=self.url, headers=self.headers).content.decode('utf-8', 'ignore')
return html
6、对第一次获取的内容进行第一次解析,从内容中得到各个新闻的链接;这里的xpath就是一种对网页内容解析的方法,与正则类似;但是需要谷歌浏览器,首先需要谷歌访问助手,然后通过助手搜索下载就可以了;F12查看网页,在所需解析的标签上单击鼠标右键,会出现一个copy Xpath,然后快捷键 ctrl+shift+x,可以复制的xpath进行校验,左框是方法,右框是内容。
# 解析函数 - 得到各个新闻链接
def parse_html(self):
html = self.get_html()
parse_html = etree.HTML(html)
r_list = parse_html.xpath('/html/body/div/div/div/div/div/a/@href')
# self.get_html2(r_list[0])
for i in r_list:
self.get_html2(i)
7、对第一次匹配出的各个链接进行第二次访问,从而拿到我们所需网页的内容,由于新闻内容的链接是通过第一次访问的链接跳转的,所以需要通过第一个链接+解析出的各个新闻链接,观察地址栏的链接和解析出来的各个新闻链接。
在拿到数据之后,要对数据进行保存,保存时又不能与之前的内容相同,于是就进行一个校验;(通常校验会有一个特殊的指纹,指纹采用md5对访问地址加密,假如下次要爬取这个链接,则校验数据库是否爬取过这个链接)
# 二级获取HTML内容
def get_html2(self,url1):
t_url = 'http://www.mot.gov.cn/jiaotongyaowen/' + url1
html = requests.get(url=t_url,headers=self.headers).content.decode('utf-8', 'ignore')
parse_html = etree.HTML(html)
title = parse_html.xpath('/html/body/div[2]/div[2]/h1') # 题目
ft = parse_html.xpath('/html/body/div[2]/div[2]/h3/font') # 来源 时间
content = parse_html.xpath('//*[@id="Zoom"]/div[1]/div/p') # 内容
title = title[0].text
fromWhere = ft[0].text[3:-19]
# print(fromWhere)
datetime = ft[0].text[-19:]
strc = ''
for i in content:
strc += etree.tostring(i, encoding="utf-8", method='html').decode()
content = strc
# print(content)
if self.is_go_on(title) == False:
print('数据已存在')
return
else:
return self.save_news(title,fromWhere,datetime,content)
# 爬取数据之前先到数据库中查询比对
def is_go_on(self,title):
sel = 'SELECT title FROM dj_news WHERE type=1 ORDER BY id DESC LIMIT 300'
self.cur.execute(sel)
result = self.cur.fetchall()
tit_r = []
for i in result:
tit_r.append(i[0])
# print(tit_r)
if title in tit_r:
return False
else:
return True
8、对拿到的数据进行保存,则完事~
# 保存数据
def save_news(self,title,fromWhere,datetime,content):
title = title
abstractM = title
fromWhere = fromWhere
datetime = datetime
content = content
type = '1'
status = '1'
# 数据库操作
sql = "insert into dj_news (title,type,abstractM,fromWhere,createTime,content,status) values (%s,%s,%s,%s,%s,%s,%s)"
self.cur.execute(sql, [title, type, abstractM, fromWhere, datetime, content,status])
self.db.commit()
print('数据存储完成')
def run(self):
self.get_html()
self.parse_html()
if __name__ == '__main__':
start = time.time()
s = News1()
s.run()
end = time.time()
print('运行时间:{}'.format(end-start))