现在很多网站都采取了反爬防护,对于初学者来说很难找到合适的网站来练习,所以干脆用云服务器自己写个页面再来爬取相关的信息。这里我使用的是阿里云服务器,CentOS系统,phpstudy集成环境
因为自己也是第一次使用云服务器,对Linux操作系统也很不熟悉,所以直接安装了phpstudy,将写好的网页放到phpstudy的www目录下即可运行。在本机输入云服务器的网址,出现以上页面则表明搭建成功
PS:因为重启了一次服务器,导致phpstudy的服务关闭了,本机访问出现404,则输入phpstudy start命令即可开启响应的服务
(有兴趣可以下载自己搭建)输入网址后效果大致如下
第一步、使用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)
查看解析结果
解析网页的html成功
第二步、爬取网页中的图片
查看图片在网页中的位置,鼠标放至想爬取的图片的位置,右键,点击检查(谷歌浏览器)即可看到图片的相关信息
右键代码部分,选择copy下的copy selector将图片的具体位置复制下来,通过select方法解析并存入变量中
images = soup.select('body > div.main-content > ul > li:nth-child(1) > img')
查看解析结果
这一张图片已经被成功解析
但往往在爬去网站的时候,我们需要爬取的是很多张图片,所以应当在描述图片位置的时候不把图片位置描述的过于“详细”
images = soup.select('body > div.main-content > ul > li > img')
查看解析结果
这样成功解析出了网站上所有的图片
第三步、解析网页中的所有元素
依照相同的方法,依次解析出图片,标题,评分,文章描述,以及文章标签元素
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')
查看解析结果
解析成功
另外,为了方便查询,我们应当将所有希望解析的元素放到统一的数据结构中,同时过滤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)
运行之后发现图片解析和文章标签解析有问题
再一次回到网页中,看到图片的信息是在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)
查看爬取结果
爬取所有元素成功
第四步、选择性爬取
选择所有大于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)
查看运行结果,对照网页,大于三分的文章就被选出来了