理解爬虫原理

不问归期 提交于 2020-01-30 02:53:20

作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2881


一. 简单说明爬虫原理:

1、向服务器发起请求

2、获取响应内容 

3、解析内容

4、保存内容 

二. 理解爬虫开发过程

1).简要说明浏览器工作原理;

2).使用 requests 库抓取网站数据;

requests.get(url) 获取校园新闻首页html代码

3).了解网页

写一个简单的html文件,包含多个标签,类,id

1).简要说明浏览器工作原理;

浏览器的主要功能是向服务器发出请求,在浏览器中展示选择的网路资源,一般资源就是HTML文档,也可以是PDF, IMGAGE,或者其他类型,资源的位置由用户使用URI(统一资源表示符)指定。

2).使用 requests 库抓取网站数据

requests.get(url) 获取校园新闻首页html代码

import requests
url='http://news.gzcc.cn/html/2019/meitishijie_0225/10895.html'
res = requests.get(url)
res.encoding='utf-8'
res.text

 

3).了解网页

写一个简单的html文件,包含多个标签,类,id

<html> \
    <body> \
          <h1 id="title">Hello</h1> \
          <a href="#" class="link"> This is link1</a>\
          <a href="# link2" class="link" qao=123> This is link2</a>\
    </body> \
</html> '
复制代码

 

4).使用 Beautiful Soup 解析网页;

通过BeautifulSoup(html_sample,'html.parser')把上述html文件解析成DOM Tree

select(选择器)定位数据

找出含有特定标签的html元素

找出含有特定类名的html元素

找出含有特定id名的html元素

 

 
result = {}
key_word = u'李克强'
 
def unzip(data):
        import gzip
        import StringIO
        data = StringIO.StringIO(data)
        gz = gzip.GzipFile(fileobj=data)
        data = gz.read()
        gz.close()
        return data
 
def init_bs(url,encoding):
    import urllib2
    html_doc = ''
    respone = urllib2.urlopen(url)
    header = respone.info()
     
    if 'Content-Encoding' in header:
        if header['Content-Encoding'== 'gzip':
  
            html_doc = unzip(respone.read()).decode(encoding,'ignore')
        else:
            pass
    else:
        html_doc = respone.read().decode(encoding,'ignore')
    return(BeautifulSoup(html_doc))
 
def get_target(soup):
    for link in soup.find_all('a'):
        text = link.get_text()
        if text.find(key_word) != -1:
            result[link.get('href')] = text
 
 
 
di = 'gb2312':['http://www.sina.com.cn','http://www.people.com.cn/','http://www.people.com.cn/'
                 ,'http://www.163.com/','http://www.qq.com/'],
      'gbk':['http://www.sohu.com'],
      'utf-8':['http://www.huanqiu.com/','http://www.xinhuanet.com/']
      }
 
for k,v in di.iteritems():
    for url in v:
         
        soup = init_bs(url,'gb2312')
        get_target(soup)
         
 
for k,v in result.iteritems():
    print k,v

 

3.提取一篇校园新闻的标题、发布时间、发布单位、作者、点击次数、内容等信息

import requests
from bs4 import BeautifulSoup
from datetime import datetime
import re

# 设置local是处理包含中文格式时间(%Y年%m月%d日)时报错:
# UnicodeEncodeError: 'locale' codec can't encode character '\u5e74'
# import locale
# locale.setlocale(locale.LC_CTYPE, 'chinese')


def crawlOnePageSchoolNews(page_url):
res = requests.get(page_url)
res.encoding = 'UTF-8'
soup = BeautifulSoup(res.text, 'html.parser')
news = soup.select('.news-list > li')
for n in news:
# print(n)
print('**' * 5 + '列表页信息' + '**' * 10)
print('新闻链接:' + n.a.attrs['href'])
print('新闻标题:' + n.select('.news-list-title')[0].text)
print('新闻描述:' + n.a.select('.news-list-description')[0].text)
print('新闻时间:' + n.a.select('.news-list-info > span')[0].text)
print('新闻来源:' + n.a.select('.news-list-info > span')[1].text)
getNewDetail(n.a.attrs['href'])


def getNewDetail(href):
print('**' * 5 + '详情页信息' + '**' * 10)
res1 = requests.get(href)
res1.encoding = 'UTF-8'
soup1 = BeautifulSoup(res1.text, 'html.parser')
news_info = soup1.select('.show-info')[0].text
info_list = ['来源', '发布时间', '点击', '作者', '审核', '摄影'] # 需要解析的字段
news_info_set = set(news_info.split('\xa0')) - {' ', ''} # 网页中的&nbsp;获取后会解析成\xa0,所以可以使用\xa0作为分隔符
# 循环打印文章信息
for n_i in news_info_set:
for info_flag in info_list:
if n_i.find(info_flag) != -1: # 因为时间的冒号采用了英文符所以要进行判断
if info_flag == '发布时间':
# 将发布时间字符串转为datetime格式,方便日后存储到数据库
release_time = datetime.strptime(n_i[n_i.index(':') + 1:], '%Y-%m-%d %H:%M:%S ')
print(info_flag + ':', release_time)
elif info_flag == '点击': # 点击次数是通过文章id访问php后使用js写入,所以这里单独处理
getClickCount(href)
else:
print(info_flag + ':' + n_i[n_i.index(':') + 1:])
news_content = soup1.select('#content')[0].text
print(news_content) # 文章内容
print('————' * 40)


def getClickCount(news_url):
# http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80
# 上面链接为文章页得出访问次数的URL
click_num_url = 'http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80'
# 通过正则表达式得出文章id
click_num_url = click_num_url.format(re.search('_(.*)/(.*).html', news_url).group(2))
res2 = requests.get(click_num_url)
res2.encoding = 'UTF-8'
# $('#todaydowns').html('5');$('#weekdowns').html('106');$('#monthdowns').html('129');$('#hits').html('399');
# 上面为response的内容

# 使用正则表达式的方法获取点击次数
# res2.text[res2.text.rindex("('") + 2:res2.text.rindex("')")],不使用正则的方式
print('点击:' + re.search("\$\('#hits'\).html\('(\d*)'\)", res2.text).group(1))


crawlOnePageSchoolNews('http://news.gzcc.cn/html/xiaoyuanxinwen/')
---------------------

**********列表页信息********************
新闻链接:http://news.gzcc.cn/html/2018/xiaoyuanxinwen_0401/9167.html
新闻标题:党情国情在我心,理想信仰伴我行——我校举行十九届三中全会和2018年“两会”知识竞赛
新闻描述:3月29日中午,我校马克思主义学院举办十九届三中全会和2018年“两会”知识竞赛,进一步坚定大学生马克思主义信仰。
新闻时间:2018-04-01
新闻来源:马克思主义学院
**********详情页信息********************
作者:陈流芳
点击:196
来源:马克思主义学院
发布时间:2018-04-01 11:57:00
审核:权麟春

为了认真贯彻党的.....

————————————————————————————————————————————————————————————————————
**********列表页信息********************
新闻链接:http://news.gzcc.cn/html/2018/xiaoyuanxinwen_0401/9163.html
新闻标题:校党委书记吕泉荣参加结对子班级主题班会
新闻描述:3月29日下午,校党委书记吕泉荣作为结对子班级指导老师,参加会计学院16会计1班“学业成绩分析”主题班会。
新闻时间:2018-04-01
新闻来源:学生工作处
**********详情页信息********************
......
---------------------

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!