Python爬虫学习------爬取搭建在云服务上的静态网页

        现在很多网站都采取了反爬防护,对于初学者来说很难找到合适的网站来练习,所以干脆用云服务器自己写个页面再来爬取相关的信息。这里我使用的是阿里云服务器,CentOS系统,phpstudy集成环境

Python爬虫学习------爬取搭建在云服务上的静态网页_第1张图片

因为自己也是第一次使用云服务器,对Linux操作系统也很不熟悉,所以直接安装了phpstudy,将写好的网页放到phpstudy的www目录下即可运行。在本机输入云服务器的网址,出现以上页面则表明搭建成功

Python爬虫学习------爬取搭建在云服务上的静态网页_第2张图片

PS:因为重启了一次服务器,导致phpstudy的服务关闭了,本机访问出现404,则输入phpstudy start命令即可开启响应的服务

(有兴趣可以下载自己搭建)输入网址后效果大致如下

Python爬虫学习------爬取搭建在云服务上的静态网页_第3张图片

 

第一步、使用Requests和BeautifulSoup解析网页

构成方式

Soup = BeautifulSoup( html , ' lxml ')

这里可以理解为右边的Soup是汤,左边的html是汤料,lxml是食谱,是解析网页的一种方式

解析网页一共有五种方式:html.parser, lxml HTML, lxml XML, html5lib, lxml,这里选用lxml,解析相对比较快,比较稳定,不过需要在pycharm上安装相应的lxml库才能使用

通过F12,刷新网页可知,该网页的请求是get方式,所以在解析网页的时候也应当使用get方式

首先导入所需的库

from bs4 import BeautifulSoup

import requests

 用url存储网站链接,通过get方式响应请求,用lxml方式解析网页

url = 'http://47.115.1.146/test/new_index.html'
wb_data = requests.get(url)
wb_data.encoding = 'UTF-8'
soup = BeautifulSoup(wb_data.text, 'lxml')
print(soup)

查看解析结果

Python爬虫学习------爬取搭建在云服务上的静态网页_第4张图片

Python爬虫学习------爬取搭建在云服务上的静态网页_第5张图片

解析网页的html成功 

第二步、爬取网页中的图片

查看图片在网页中的位置,鼠标放至想爬取的图片的位置,右键,点击检查(谷歌浏览器)即可看到图片的相关信息

Python爬虫学习------爬取搭建在云服务上的静态网页_第6张图片

右键代码部分,选择copy下的copy selector将图片的具体位置复制下来,通过select方法解析并存入变量中

images = soup.select('body > div.main-content > ul > li:nth-child(1) > img')

查看解析结果

Python爬虫学习------爬取搭建在云服务上的静态网页_第7张图片

这一张图片已经被成功解析

但往往在爬去网站的时候,我们需要爬取的是很多张图片,所以应当在描述图片位置的时候不把图片位置描述的过于“详细”

images = soup.select('body > div.main-content > ul > li > img')

查看解析结果

Python爬虫学习------爬取搭建在云服务上的静态网页_第8张图片

这样成功解析出了网站上所有的图片

第三步、解析网页中的所有元素

依照相同的方法,依次解析出图片,标题,评分,文章描述,以及文章标签元素

images = soup.select('body > div.main-content > ul > li > img')
titles = soup.select('body > div.main-content > ul > li > div.article-info > h3 > a')
numbers = soup.select('body > div.main-content > ul > li > div.rate > span')
describs = soup.select('body > div.main-content > ul > li > div.article-info > p.description')
logos = soup.select('body > div.main-content > ul > li> div.article-info > p.meta-info > span')

查看解析结果

Python爬虫学习------爬取搭建在云服务上的静态网页_第9张图片

解析成功

另外,为了方便查询,我们应当将所有希望解析的元素放到统一的数据结构中,同时过滤html中的标签

for image, title, number, describ, logo in zip(images, titles, numbers, describs, logos):
    data={
        'image': image.get_text(),
        'title': title.get_text(),
        'number': number.get_text(),
        'describ': describ.get_text(),
        'logo': logo.get_text()
    }
    print(data)

运行之后发现图片解析和文章标签解析有问题

Python爬虫学习------爬取搭建在云服务上的静态网页_第10张图片

再一次回到网页中,看到图片的信息是在src下,因此更改一下图片和文章标签的爬取

 
data={
    'image': image.get('src'),
    'title': title.get_text(),
    'number': number.get_text(),
    'describ': describ.get_text(),
    'logo': list(logo.stripped_strings)
}

 

from bs4 import BeautifulSoup
import requests

url = 'http://47.115.1.146/test/new_index.html'
wb_data = requests.get(url)
wb_data.encoding = 'UTF-8'
soup = BeautifulSoup(wb_data.text, 'lxml')

images = soup.select('body > div.main-content > ul > li > img')
titles = soup.select('body > div.main-content > ul > li > div.article-info > h3 > a')
numbers = soup.select('body > div.main-content > ul > li > div.rate > span')
describs = soup.select('body > div.main-content > ul > li > div.article-info > p.description')
logos = soup.select('body > div.main-content > ul > li> div.article-info > p.meta-info > span')

for image, title, number, describ, logo in zip(images, titles, numbers, describs, logos):
    data={
        'image': image.get('src'),
        'title': title.get_text(),
        'number': number.get_text(),
        'describ': describ.get_text(),
        'logo': logo.get_text()
    }
    print(data)
#print(images, titles, numbers, describs, logos,sep='\n------------------\n')
#print(soup)

 

查看爬取结果

Python爬虫学习------爬取搭建在云服务上的静态网页_第11张图片

爬取所有元素成功

第四步、选择性爬取

选择所有大于3分的文章,并把选出的结果放入一个info列表中

from bs4 import BeautifulSoup
import requests

info = []
url = 'http://47.115.1.146/test/new_index.html'
wb_data = requests.get(url)
wb_data.encoding = 'UTF-8'
soup = BeautifulSoup(wb_data.text, 'lxml')

images = soup.select('body > div.main-content > ul > li > img')
titles = soup.select('body > div.main-content > ul > li > div.article-info > h3 > a')
numbers = soup.select('body > div.main-content > ul > li > div.rate > span')
describs = soup.select('body > div.main-content > ul > li > div.article-info > p.description')
logos = soup.select('body > div.main-content > ul > li> div.article-info > p.meta-info')

for image, title, number, describ, logo in zip(images, titles, numbers, describs, logos):
    data={
        'image': image.get('src'),
        'title': title.get_text(),
        'number': number.get_text(),
        'describ': describ.get_text(),
        'logo': list(logo.stripped_strings)
    }
    info.append(data)

for i in info:
    if float(i['number'])>3:
        print(i['title'],i['logo'])
#print(images, titles, numbers, describs, logos,sep='\n------------------\n')
#print(soup)

查看运行结果,对照网页,大于三分的文章就被选出来了

Python爬虫学习------爬取搭建在云服务上的静态网页_第12张图片

 

 

 

 

 

 

 

 

你可能感兴趣的:(Python学习)