运行环境
- windows10
- anaconda3 ( python3都行)
- pycharm 社区版
- 谷歌浏览器 ( 其他的也行 )
本次Demo用到的库及其作用如下:
- requests库 模拟用户提交 HTTP请求,获取网页的内容
- re库 对字符串进行正则表达式匹配,用于获取目标内容
- bs4库,对网页字符串进行格式化,可通过类名、ID、标签名三种方式定义对应的标签
- pandas库,将爬取的内容存入DataFrame二维表,方便查看与导出
首先导入需要用到的库
import requests
import re
from bs4 import BeautifulSoup
import pandas as pd
提示:若在运行中报错,则可能是因为python环境中缺少对应的库,可以在python shell里安装
pip install 库名
#3.x版本
pip3 install 库名
@
爬虫模板
# 一、导库
import requests, re, pandas as pd
from bs4 import BeautifulSoup
# 二、设置请求网页的信息: 网址url + header请求头
url = '爬取的网站地址'
headers = {
'User-Agent': '通过浏览器调试工具查看',
}
# 三、使用 requests库 获取网页响应的结果文件
html = requests.get(url, headers=headers).text
# 四、使用 BeautifulSoup库 解析HTML网页内容
soup = BeautifulSoup(html)
# 五、结果bs库和re库的正则表达式提取需要的数据
data = []
for x in soup.select("定位标签"):
data.append(re.search('>([^<]+)<', str(x)).group(1))
# 六、将结果保存到 DataFrame对象,并将结果导出到本地文件
df = pd.DataFrame({'中国省份' : data})
df.to_csv('导出的文件名.txt', sep='\t',index=False, header=None)
爬虫第一步:获取 URL,设置请求头User-Agent
现在许多网站都有反扒机制,比如笔者在尝试爬取京东购物网时,发现需要登录才能爬取,而且第一页和第二页的网址URL不仅仅是单个参数的变化,不过肯定是有相应的爬虫技术解决这个问题的,这里基于笔者的知识面暂时只做简单的入门。
1.1 获取URL
以当当购物网 http://www.dangdang.com/ 为例,浏览器里显示的地址,加上http:// 前缀就是我们要设置的URL,有的网站是https:// ,这表示http协议的一种加密协议。
1.2 设置请求头
查看请求头 User-Agent 通常使用浏览器的调试工具,快捷键 F12
在调试工具中 切换到 [ NetWork ]
、中文版的话就是 [ 网络 ]
点击后,设置录制状态,并刷新网页,等待一段时间则会显示获取到的网站资源
选择 www.dangdang.com 这个资源,可以查看底部有一个JSON 格式的键值对 User-Agent : ...
其后面的内容就是我们要设置的请求头,这样在向网页发送请求时,网页就会将我们识别成用户,而不是爬虫的机器。
1.3 python 代码实现
这里的 User-Agent 以笔者的为例,每台机器的请求头不相同,记得更换。
url = 'www.dangdang.com'
# 以字典的形式设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
爬虫第二步:发送请求,获取响应的网页内容
这一步需要用到 requests库
,其作用是按我们的要求向网站发送请求
2.1 Python 代码实现
import requests
url = 'https://category.dangdang.com/pg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
response = requests.get(url, headers=headers)
html = response.text
print(html)
2.2 运行结果
爬虫第三步: 解析网页内容,提取数据
通过 requests 发送请求后返回的结果是一个HTML文本,此时它还没有具体的作用。
接下来使用 来自 bs4库的 BeautifulSoup ,它支持将HTML内容转化为树状型的数据结构
比如在返回的结果内容中有:
<ul class="ddnewhead_area_list" style="display: none;" id="area_list" onmouseover="this.style.display='block';"
onmouseout="this.style.display='none';">
<li><a href="javascript:void(0);" onclick="change_area('111','北京')" num="111">北京</a></li>
<li><a href="javascript:void(0);" onclick="change_area('112','天津')" num="112">天津</a></li>
....
这里是对应网站的这部分内容
现在可以一次性将里面的省份全部读取下来
3.1 Python 代码实现
import requests
from bs4 import BeautifulSoup
url = 'https://category.dangdang.com/pg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html)
for x in soup.select(".ddnewhead_area_list > li > a"):
print(x)
3.2 运行结果
爬取的结果如下:
3.3 Re库提取关键信息
可以观察到我们需要的信息被 <a>
标签所包裹,现在则可以使用简单的正则表达式将其获取
print(re.search('>([^<]+)<', str(x)).group(1))
实现效果
爬虫第四步:使用DataFrame保存数据
DataFrame类似一个Excel表格,而且有许多原生的API进行数据变换的操作,这里主要用来保存。
4.1 根据列表创建 DataFrame对象
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
url = 'https://category.dangdang.com/pg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
}
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html)
data = []
for x in soup.select(".ddnewhead_area_list > li > a"):
data.append(re.search('>([^<]+)<', str(x)).group(1))
df = pd.DataFrame({'中国省份' : data})
print(df)
运行结果:
4.2 导出DataFrame到本地
导出DataFrame通过调用该对象的 to_xxx 方法,其中有常用的几个参数:
- sep 设置列之间的分隔符号
- index 设置导出的结果文件是否带行下标
- header 设置导出的结果文件是否带列名
df.to_csv('test.txt', sep='\t',index=False, header=None)
至此,已实现了最入门的python爬虫过程。