python进行爬虫

 

 使用python进行网络爬虫

非结构画数据 转为 结构化数据。须要借助ETL(数据抽取,转换,存储)进行。css

非结构化数据蕴含着丰富的价值。须要借助ETL进行转换成结构化数据,才能变成有价值的数据。好比下边的网页,信息是非结构化的,咱们须要把他们转为结构化的数据,才会变成有价值的信息。html

再例如搜索引擎,就是利用网络爬虫技术,去各个网站爬虫数据,而后作成索引,而后供咱们查找。为何今天的爬虫技术这么热呢?由于咱们须要的数据好多都不在本身的数据库上,因此只能经过网络爬虫的技术去网络上爬取。python

一 网络爬虫架构

通常网络爬虫架构以下:web

首先咱们要有一个网页连接器,而后去网站的服务器进行请求,而后服务器给咱们反应。咱们能够又键鼠标,而后选择检查数据库

 

 

而后选择Network选项,而后点击左上角的刷新按钮,发现左下角有67个请求。服务器

这些功能本来是给网页开发人员使用的,但network也能够给咱们轻松使用,分析获得什么样的请求,获得了什么回应。websocket

咱们点击左上角的漏斗行的按钮,发现获得不少信息。网络

 

XHR:网站回应的内容架构

JS:和网页互动socket

CSS:网站的化妆品,呈现颜色等

Img:图片

Media:多媒体资料,如视频

Font:文字

Doc:网页资料

WS:是websocket

Manifest:宣告

Other:其余

咱们的新闻内容通常就是放在了Doc里边了,点击Doc按钮,选择第一个页面的Response。

经过比较咱们的网站内容和html,发现很像,那么这些资料颇有可能就是咱们须要的资料。

 

二 网络爬虫背后的秘密

如何观察一个网页,而后把有用的内容抓取下来?

首先咱们能够用开发人员工具,右键选择检查,而后选择Doc,在选择第一个连接。

为何能够在Doc里边找到呢?由于每个网站都须要被搜索引擎爬虫到的需求,百分之九十的都会在Doc里边找到。如何判断这个连接就是咱们须要抓取的内容呢?咱们能够经过比较html内容和网页内容来判断。

咱们选择Headers内容:

 

 

 什么是get方法呢?

咱们能够把get方法想象成一个明信片,咱们经过get方法来访问服务器,当服务器收到咱们的get以后,知道了咱们的来意,就能够把相应的回应返回给咱们。

经过pip安装套件:

  pip insatll requests

  pip install BeautifulSoup4

三 编写第一个网络爬虫

使用Request进行操做,(不实用Urllib2,由于它用起来很是的麻烦)。

回到新浪页面,既然能够用get获得这个页面,那么就用这个网址进行获取这个页面。

import requests res=requests.get('https://news.sina.cn/gn/?from=wap') print(res)

 

import requests res=requests.get('https://news.sina.cn/gn/?from=wap') print(res.text)

 

乱码是由于解码的问题,python误认为是其余的编码方式,

能够用encoding查看编码形式

import requests res=requests.get('https://news.sina.cn/gn/?from=wap') print(res.encoding)

修改代码以下:

import requests res=requests.get('https://news.sina.cn/gn/?from=wap') res.encoding='utf-8'
print(res.text)

此时不会再乱码了

可是如今的信息依然存在html中,如何把这些信息转成结构化信息呢?

咱们可使用DOM的方法,即Document Object Model,这是一组API,能够用来和网页元素进行互动,

 

咱们能够看到这么一棵树,最上边是html,而后下边是body。

 

# import requests # # res=requests.get('https://news.sina.cn/gn/?from=wap') # res.encoding='utf-8' # print(res.text)

from bs4 import BeautifulSoup html_samp=" \ <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_samp) print(soup.text)

运行获得:

输出了内容,可是有一个警告,由于咱们没有指定一个剖析器,此时程序会给咱们一个默认的。咱们也能够指定一个剖析器,避免这个警告。

改写语句:

soup=BeautifulSoup(html_samp,'html.parser')

咱们要抓取的内容也许是在特殊的标签之中,那么如何从特殊的标签和节点之中找到咱们须要的数据呢?

咱们能够用select方法,把含有特定标签的数据取出来

 

from bs4 import BeautifulSoup html_samp=" \ <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_samp,'html.parser') header=soup.select('h1') #由于soup中可能会有不少的h1标签,因此上边的header是一个list,因此header[0]表示第一个h1标签
print(header[0])

输出为:

若是要输出其中的内容的画,能够用header[0].text获得其中的内容。

 

css是网页化妆品,当咱们取用里边的词,当里边的id为title时,必需要加上‘#’,才能够存取,若是为class的话,必需要加上‘.’才能够存取。

from bs4 import BeautifulSoup html_samp=" \ <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_samp,'html.parser') #为title的要加上'#'
alink=soup.select('#title') print(alink) #为class的,要加上'.'
for link in soup.select('.link'): print(link)

最后,还有一个需求,在网页的连接上,咱们会用a tag去联系到不一样的网页,a tag里边有一个特殊的属性href,使用href才能够联系到其余的网页。

from bs4 import BeautifulSoup html_samp=" \ <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_samp,'html.parser') alinks=soup.select('a') for link in alinks: print(link) #之因此咱们会用link['href']这样的写法,是由于其中的存取是使用了字典的形式
    print(link['href'])

 

四 抓取新浪新闻内容

咱们已经知道,1.使用requests.get取得页面内容;使用beautifulsoup4把内容剖析出来。

那咱们应该怎么对新浪新闻的标题,时间,连接等取出来呢?

相关文章
相关标签/搜索