Python爬虫 (一) | 案例及模板 简要四步爬取购物网站信息 | 基于 requests、re、 pandas、 bs4


运行环境


  • 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爬虫过程。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM