网络爬虫(又称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
前言
最近接到了个爬取一些网站积分商品数据的需求,学习了一下爬虫的知识。为了避免以后忘记,特写一篇文章来总结一下,也希望能帮到对爬虫有兴趣的同学。本文将从爬取网站商品数据的需求入手,详细介绍如何爬取网页的数据以及将爬取到的数据写入到CSV文件中。本文爬取的是静态网页,爬取动态网页的教程欢迎查看另一篇文章(暂时还没有写。。写了会贴出来),分辨静态网页和动态网页的方法在下文实战-浏览器检查网页中。
安装
本文使用Python的requests和beautifulsoup库爬取数据,安装python的部分本文就不叙述了。
Requests是一个基于Apache2协议开源的Python HTTP库,使用requests库可以获取网页的HTML信息。Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。win+r,输入cmd打开命令行界面,分别输入以下命令安装requests和beautifulsoup库:
pip install requests
pip install beautifulsoup4
下面会根据实战需求讲解requests库和Beautiful Soup库的部分使用方法,详细内容可查看官方文档。
requests库:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
Beautiful Soup库:http://beautifulsoup.readthedocs.io/zh_CN/latest/
实战
1.需求
招商银行信用卡积分兑换商城:https://www.51credit.com/jifen/zhaoshang/p1/
爬取招商银行信用卡积分兑换商城中的商品名称和商品分类。
2.浏览器检查网页
输入网址进入网页后,点按F12或者鼠标右键-检查,即可看到一大堆代码,也就是网页的HTML。在HTML中可以找到商品的信息:
也可以鼠标右键-查看页面源代码查看网页的HTML。可以直接在页面源代码HTML中找到数据的网页是静态网页,找不到的就是动态网页。
静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。
静态网页的爬取数据相对简单点,获取到网页的HTML,从HTML中解析到自己想要的数据,然后保存即可。
3.requests库获取HTML数据
使用requests.get()方法获取网页的HTML:
import requests
url = 'https://www.51credit.com/jifen/zhaoshang/p1/'
req = requests.get(url)
html = req.text
print(html)
requests.get()方法必须设置的一个参数就是url,因为我们得告诉GET请求,我们的目标是谁,我们要获取谁的信息。运行结果为:
可以看出,我们已经获取了网页的HTML,接下来就是从HTML中解析出商品的数据了。
3.Beautiful Soup库解析HTML数据
F12进入检查,从HTML中查找商品的数据,可以发现所有的商品数据都存放在标签<ul class="list_pro clearfix">
中:
使用以下代码获取标签<ul class="list_pro clearfix">
中的数据:
import requests
from bs4 import BeautifulSoup
url = 'https://www.51credit.com/jifen/zhaoshang/p1/'
req = requests.get(url)
html = req.text
bf = BeautifulSoup(html)
#获取标签<ul class="list_pro clearfix">中的内容
ul_data = bf.find_all('ul', class_ = 'list_pro clearfix')
print(ul_data)
find()返回的是第一个匹配的标签结果,find_all()方法返回的是所有匹配结果的列表。
运行结果为:
运行结果中已经可以看到商品的名称和类别信息了,当然这还不够,我们还需把数据继续解析出来。
继续查看HTML代码:
商品类别在<li>
标签下的<p class="c6">
标签中,商品名称在<li>
标签下的<h4>
标签中。
正所谓由浅入深,我们先试着把第一个商品的数据解析出来:
import requests
from bs4 import BeautifulSoup
url = 'https://www.51credit.com/jifen/zhaoshang/p1/'
req = requests.get(url)
html = req.text
bf = BeautifulSoup(html)
#获取标签<ul class="list_pro cl