Python实现网络爬虫基础学习(一)

非结构数据处理与网络爬虫

非结构化数据:(1)没有固定的数据格式,例如网页资料;(2)必须透过ETL(Extract(数据抽取),Transformation(数据转换),Loading(数据储存)三个方法)工具将数据转换为结构化数据才能取用

 网络爬虫-----将非结构化的网页数据转换成结构化信息

 

 网页右键---->检查或者直接点击F12按键

只要是新闻网页都有被搜寻引擎搜寻到的需求,那一般搜寻引擎对document的资源是最好的,所以百分之九十的情况下找doc下面的第一个链接都可以准确的将媒体的资讯爬取下来 ,当点击network后,最好点击刷新。

response里搜索想要查找的资讯 

 什么是get,可以把get的方法想象成是明信片,把网址的资讯写在明信片上,,我们送出的http请求就像是把明信片送出去一样,当我们网页的适配器看到这张明信片、了解我们的来意后,就可以把对应的回应回传回来,那么我们要怎么写一个程序去模拟浏览器送出get请求的过程呢-------->可以采用python:

透过pip安装套件:

pip install requests;

pip install BeutifulSoup4;

1、如果要使用jupyter实现编写python程序,就需要用到jupyter notebook,所以要安装Jupyter

 

新建一个python小程序: 

 

编写第一个网络爬虫程序

    requests套件:改善了urllib2的缺点,让读者以最简单的方式获取网络资源;可以使用request操作(post,put,get,delete)存取网络资源。

     导入requests库,可以了解到上面我们所截取的图片中header中URL为http://news.sina.com.cn/,请求方法为get方法,所以采用get方法编写爬虫:

import requests#导入requests库
res=requests.get("http://news.sina.com.cn/")#get方法请求获取新浪网数据
res.encoding="utf-8"#避免出现乱码,设置编码格式为utf-8
print(res.text)#做内容的提取

如何确定所抓取的页面是不是我们想要爬取的页面----比较一下想要抓取的页面的关键词,使用Ctrl+F进行搜索

用beautifulsoup剖析网页元素 

确定了取得我们要的页面以后,有一个问题,这些资料还是镶嵌在HTML tag当中,我们还是无法顺利取用这些资料,接下来该怎么把这些非结构化的数据转换成结构化的数据。这时候可以借由DOM(document object model)的方法,可以跟网页里面的元素进行互动,接下来我们可以进一步使用beautifulsoup进行操作,beautifulsoup的安装刚刚已经进行过了

命令提示符cmd以管理员方式运行输入:pip install BeautifulSoup4

安装完以后我们就可以将网页读取进入beautifulsoup,接下来就可以将文字剖析出来

        beautifulsoup和requests ,requests是将网页给出的回应返回回来,而soup则是取出回应的文字,我们也可以看一下两种类型有什么不同:

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)
print(type(soup))

 使用select筛选出需要的信息

 代码如下:

#使用select找出含有h1 标签的元素
soup = BeautifulSoup(html_sample,"html.parser")
header = soup.select("h1")
alink = soup.select("a")
print(header)#取出的是一个list
print(header[0])#取出的是第一个h1标签的元素
print(header[0].text)#取出第一个元素对应的文字
print(alink)#取出的是alink的所有元素组成的list
for link in alink:
    print(link)#将alink中的元素分别在两行打印出来
    print(link.text)

那么如何取得含有特定CSS属性的元素

 #使用select我出所有id为title的元素(id前面加 # )
    alink =soup. select("#title" )
    print("使用select找出所有id为title的元素:")
    print (alink)
    #使用select找出所有class为link的元素(class前面需加小数点”)
    print("使用select找出所有classカlink的元素:")
    for link in soup.select(".link") :
        print(link )
    #使用select找出所有a tag的href链接
    print("使用select出所有a tag的href撻接:")
    alinks = soup. select('a')
    for link in alinks:
        print(link)
        print(link [' href'])

抓取数据信息

       那么做了这么多努力,我们该怎么抓取新浪新闻的文字呢内容

       因为response的元素很复杂所以我们要找到特定的元素后才去进行抽取,使用左上角的元素观测,选择到我们的列表部分,按一下就会发现在下方会有与之对应的元素内容,具体看图:

接下来举例抓取国管局信息,搜索国管局--->打开国管局官网

 打开新闻资讯页面

 接下来鼠标拖动到此处--->右键--->copy--->copy selector

将复制的信息粘贴到soup.select中,就可以看到抓取的信息已经全部打印出来 

 已经获取到资讯,接下来去时间爬去具体的资讯文本内容,以及链接,以及时间,从网页上分析可以发现

下面查看执行结果,因为这个资讯列表全部放在一个class里面,所以我在这个地方用到了循环

import requests
    from bs4 import BeautifulSoup
    res = requests.get("http://www.ggj.gov.cn/xwzx/tpxw/")  # 请求 获取国管局信息
    res.encoding = "utf-8"
    soup = BeautifulSoup(res.text, "html.parser")  # 抓取出国管局网页面信息
    for l in soup.select('body > div.mainbox.boxcenter > dl.listbox.boxcenter'):  # 抓取新闻资讯
        s = l.select("a")  # 抓取出a标签的文本信息
        a = l.select('a')  # 找出a标签下的文本对应的链接
        time = l.select('i')#找出带i标签的时间
        for i in range(len(s)):#因为得到的结果是一个list,所以需要解开list,获取资讯条数进行循环输出资讯的内容
            s1 = s[i].text#获取内容的文本,逐条显示
            a1 = a[i]['href']#获取链接
            t1 = time[i].text#获取时间
            print(t1, s1, a1)#打印

猜你喜欢

转载自blog.csdn.net/weixin_42280639/article/details/81166985