learn from:天善智能云课堂

1.原理:

要把非结构化数据整理为结构化数据

方法:数据抽取,转换,存储(Data ETL)

 第一次尝试做的爬虫:爬取新浪新闻信息

ETL(Extract提取,Transformation转换,Loading装载)

架构:

 第一次尝试做的爬虫:爬取新浪新闻信息

 2.信息查看:

1).网页右键,点击检查

2).点击network

3).所要的信息百分之90在doc

 

3.必备套件:

 第一次尝试做的爬虫:爬取新浪新闻信息

~如果安装anaconda,anaconda自带了BeautifulSoup4,Requests,jupyter notebook免安装

要爬的网址可以在Chrome浏览器进入要爬的主页,右键检查元素,点击Network,然后刷新一下网页(快捷键:F5)

 第一次尝试做的爬虫:爬取新浪新闻信息

点击doc,再点击第一个网页,下图圈中的网址就包含大部分要爬的资源

 第一次尝试做的爬虫:爬取新浪新闻信息

输入代码:

import requests
res = requests.get("要爬的网址")
print(res.text)

发现有乱码现象,把res.text改为res.encoding可查看预设的编码

 第一次尝试做的爬虫:爬取新浪新闻信息

添加一行代码 res.encoding = '预设的编码',就不会乱码了

代码具体如下:

import requests
res = requests.get("要爬的网址")

res.encoding = 'utf-8'
print(res.text)

验证你所要的信息是在你截取的网址上,由于我的是chrome浏览器,直接ctrl + f 进行查找,把你想要到信息粘贴到搜索栏:

 第一次尝试做的爬虫:爬取新浪新闻信息

 

把非结构化数据转换为结构化数据:

 第一次尝试做的爬虫:爬取新浪新闻信息

from bs4 import BeautifulSoup
html_sample = ' \
<html> \
<body> \
<h1 id ="title"> hello world </h1> \
<a href ="#" class = "link"> This is link1</a> \
<a href ="# link2" class = "link"> This is link2</a> \
</body> \
</html> '
soup = BeautifulSoup(html_sample)
print(soup.text)

 

代码加入parser ,即 ‘html.parser’

是解析Html的一个工具。python自带的

 

from bs4 import BeautifulSoup
html_sample = ' \
<html> \
<body> \
<h1 id ="title"> hello world </h1> \
<a href ="#" class = "link"> This is link1</a> \
<a href ="# link2" class = "link"> This is link2</a> \
</body> \
</html> '
soup = BeautifulSoup(html_sample,'html.parser')

print(soup.text)

第一次尝试做的爬虫:爬取新浪新闻信息

 第一次尝试做的爬虫:爬取新浪新闻信息

遇到的问题

1.如果出现如下图情况,一般不是网上所说的字符串结尾不能有“ \ ”,因为该字符串结尾为"  > ",一般是因为某行多了空格,找到多打的空格,将其删掉即可。

 第一次尝试做的爬虫:爬取新浪新闻信息

2.安装jupyter后打不开

1.可在相应的Python35\Scripts中找到jupyter-notebook.exe,点击看看是否能打开

2.万恶的防火墙(很多程序员软件明明安装好了,甚至找到并点击EXE都不能运行,很大原因是防火墙的问题)

win + r,运行control

点击系统和安全

关闭防火墙(或自己在百度上找防火墙允许程序允许的方法)

3.如图,原因是href="#"不是href='#'

 第一次尝试做的爬虫:爬取新浪新闻信息

正确结果:

 第一次尝试做的爬虫:爬取新浪新闻信息

4.如图,原因是id用#,class用.

 第一次尝试做的爬虫:爬取新浪新闻信息

选择标题注意是class还是id

正确:

 第一次尝试做的爬虫:爬取新浪新闻信息

5.

import requests
import json
res =requests.get('http://cre.mix.sina.com.cn/api/area/news?other=commentid&num=22&page=1&offset=0&callback=jsonpcallback1529853932472&_=1529853959865')
print(res.text.rstrip(');').lstrip('jsonpcallback1529853932472('))

 .rstrip('')去除不了最后面的 );

网址有问题,换个网址

 第一次尝试做的爬虫:爬取新浪新闻信息

 

 6.

 第一次尝试做的爬虫:爬取新浪新闻信息

抓取新闻内文页面:

import requests
from bs4 import BeautifulSoup
res = requests.get('http://news.sina.com.cn/china/')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')

抓取标题:

soup.select(".main-title")[0].text

取得新闻发布时间:

当新闻时间的class或id含有其他元素时,

timesource =soup.select(".date")[0].contents[0].strip()

此时timesource为str格式需转换为日期格式:

from datetime import datetime

dt =datetime.strptime(timesource,'%Y年%m月%d日 %H:%M')

print(dt)

 

.strip() 能删除开头或是结尾的字符

时间转字符串 strftime):

dt.strftime('%Y-%m-%d %H:%M')

 

整理新闻内容:

article =[]
for p in soup.select('.article p')[:-1]:
article.append(p.text.strip())
print(article)

'\n'.join(article)

简短写法:'\n'.join([p.text.strip() for p in soup.select('.article p')[:-1]])

join()方法 返回通过指定字符连接序列中元素后生成的新字符串

 

取得新闻编辑者的名称:

editor  =soup.select(".ep-editor")[0].text.strip('责任编辑:')

.strip('责任编辑:') 去除“责任编辑:”字眼

 

取得评论数:

soup.select('.post_cnum_tie js-tielink js-tiejoincount')

结果为空,如图:

 第一次尝试做的爬虫:爬取新浪新闻信息

1)找寻评论出处

可能在js那里

import requests

comments = requests.get('找到的js网址')

import json

jd = json.loads(comment.text.strip('var data='))

 

取得评论数与评论内容:

jd = json.loads(comments.text.strip('var data='))

jd['result']['count']['total']

取得新闻id

方法1

 第一次尝试做的爬虫:爬取新浪新闻信息

方法2

 第一次尝试做的爬虫:爬取新浪新闻信息

 整理成统一函式

 第一次尝试做的爬虫:爬取新浪新闻信息

 

 

 

 

 

 

 

import requests

from bs4 import BeautifulSoup

def getNewsDetail(newsurl):

    result={}

    res = requests.get(newsurl)

    res.encoding ='utf-8'

    soup =BeautifulSoup(res.text,'html.parser')

    result['title']=soup.select('#artibodyTitle')[0].text

    result['newssource']=soup.select('.time-source span a')[0].text

    timesource = soup.select('.time-source')[0].contents[0].strip()

    result['dt']= datetime.strptime(timesource,'%Y%m%d%H:%M')

    result['article']= '\n'.join([p.text.strip() for p in soup.select('#artbody p')[:-1]])

    result['editor'] = soup.select('.article-editor')[0].text.strip('责任编辑:')

    result['comments'] = getCommentCounts(newsurl)

return result

 

然后我们找到分页连结

方法如下:

 第一次尝试做的爬虫:爬取新浪新闻信息

剖析分页信息

 第一次尝试做的爬虫:爬取新浪新闻信息

结果:

 第一次尝试做的爬虫:爬取新浪新闻信息

整成新闻的URL链接

 第一次尝试做的爬虫:爬取新浪新闻信息

 

建立链式剖析清单函式:

 第一次尝试做的爬虫:爬取新浪新闻信息

代码实现

 第一次尝试做的爬虫:爬取新浪新闻信息

结果

 第一次尝试做的爬虫:爬取新浪新闻信息

 

最后我们将所抓的数据保存到自己想Excel或者数据库

    方法

 第一次尝试做的爬虫:爬取新浪新闻信息

 

使用Pandas整理

 第一次尝试做的爬虫:爬取新浪新闻信息

 

运行之后

 第一次尝试做的爬虫:爬取新浪新闻信息

 

比如保存到自己的Excel

第一次尝试做的爬虫:爬取新浪新闻信息

 第一次尝试做的爬虫:爬取新浪新闻信息

 

 

 

哈哈最后的结果

 第一次尝试做的爬虫:爬取新浪新闻信息

 

第一次尝试做爬虫可能还有很多地方做的不够好讲的也不好,哈哈!欢迎各位大神给予指导

 

另外附带一些Jupyter Notebook的快捷键

Jupyter Notebook 的快捷键的使用教程

 有两种键盘输入模式。

编辑模式 (按键 Enter 开启),可以在单元中键入代码或文本;这时的单元框线是绿色的。

命令模式 (按键 Esc 开启),键盘输入运行程序命令;这时的单元框线是灰色。

 忘了快捷键,直接按H(如果在单元里需要点击esc键后按H) : 显示快捷键帮助

 

一般写代码时流程:

1.一般是先进入是直接打代码

1)运行本单元代码:Ctrl-Enter

2)运行本单元代码选中下个单元Shift-Enter

    然后按enter编辑下个单元

 

2.在单元里写代码时好用的快捷键

· Ctrl-] : 缩进

· Ctrl-[ : 解除缩进

· Ctrl-A : 全选

· Ctrl-Z : 复原

· Tab : 代码补全或缩进

 

3.编辑单元时好用的快捷键

        D,D : 删除选中的单元

        Z : 恢复删除的最后一个单元

        B : 在下方插入新单元

        Space(空格键): 向下滚动

        Ctrl-S : 文件保存

      

 

 

 

 

 

 

 

 

相关文章:

  • 2021-12-09
  • 2021-07-03
  • 2021-12-10
  • 2022-12-23
  • 2021-09-15
  • 2021-12-26
猜你喜欢
  • 2021-08-18
  • 2022-12-23
  • 2022-12-23
  • 2021-08-25
  • 2022-12-23
  • 2021-06-01
  • 2021-11-17
相关资源
相似解决方案