Python爬虫实战案例:大众点评商家数据爬取指南

前言

网络爬虫(Web Crawler),也称为网页蜘蛛(Web Spider)或网页机器人(Web Bot),是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓取等。

爬虫的基本原理

  1. 种子 URL:爬虫从一个或多个种子 URL 开始,这些 URL 是起点。
  2. 发送请求:爬虫向这些种子 URL 发送 HTTP 请求,通常是 GET 请求。
  3. 获取响应:服务器返回网页的 HTML 内容作为响应。
  4. 解析内容:爬虫解析 HTML 内容,提取所需的数据(如文本、链接、图片等)。
  5. 提取链接:从网页中提取出所有链接,并将这些链接加入待访问队列。
  6. 重复过程:爬虫重复上述步骤,直到达到某个停止条件,如爬取了一定数量的页面,或所有页面都被爬取完毕。

爬虫的分类

  1. 通用爬虫

  2. 设计用于抓取整个互联网的大量网页。搜索引擎(如 Google、Bing)的爬虫就是通用爬虫。
  3. 聚焦爬虫

  4. 专注于特定主题或领域,抓取相关网页。比如,一个新闻爬虫只抓取新闻网站的内容。
  5. 增量爬虫

  6. 仅抓取自上次爬取以来发生变化或更新的网页,适用于动态内容更新频繁的网站。

爬虫的合法性和道德

在编写和运行爬虫时,必须遵循以下原则:

  1. 遵守网站的 robots.txt

  2. 大多数网站都有一个 robots.txt 文件,规定了哪些页面允许被爬取,哪些不允许。爬虫应当尊重这些规则。

  3. 避免过度抓取

  4. 设置适当的抓取频率,避免对服务器造成过大负担。
  5. 尊重版权和隐私

  6. 不应抓取或使用受版权保护的内容,或涉及用户隐私的数据。
  7. 获取许可

  8. 在某些情况下,最好获得网站管理员的许可,特别是当你打算频繁地抓取大量数据时。

通过以上方法和原则,可以编写高效、可靠且合规的网络爬虫来满足数据采集的需求。 

侦察

页面如下,笔者这里是美食类的,别的应该也可以

往下看有页数

页数参数找到了,代码中可以用变量代替 

刷新网页请求查看数据来源 

蛮多了,关键字搜索一下 

四个数据来源都是这个网址那我们要请求的就是这个,当然,你也可以搜索别的再确认一下

看下请求头,需要伪造

源代码

import re
import requests
from bs4 import BeautifulSoup


def work(dic, url, headers):
    # 发送请求
    response = requests.get(url, headers=headers)

    # 使用BeautifulSoup解析HTML
    soup = BeautifulSoup(response.text, 'lxml')

    # 获取所有<li>标签
    li_elements = soup.find('div', id='shop-all-list').find('ul').find_all('li')

    # 遍历<li>标签
    for li in li_elements:
        # 店名
        name = li.find('h4').get_text(strip=True)

        # 评价
        review_num = li.find('a', class_='review-num').find('b').get_text(strip=True) + '条评价'

        # 人均(不知道为什么有时候会报错,所以加个报错处理)
        # 初始化变量以存储b标签的文本
        text = ""

        # 使用try-except语句来捕获可能发生的异常
        try:
            # 尝试找到a标签,然后找到b标签,并获取文本
            a_element = li.find('a', class_='mean-price')
            if a_element:
                b_element = a_element.find('b')
                if b_element:
                    text = b_element.get_text(strip=True)
                    # 使用正则表达式提取数字
                    numbers = re.findall(r'\d+', text)
        except Exception as e:
            # 确保numbers保持为空列表,以便后续处理
            numbers = []

        # 菜系和地址(class 都是 tag)
        # 在div元素下查找所有class为tag的span标签
        spans = li.find('div', class_='tag-addr').find_all('span', class_='tag')

        # 遍历找到的span标签
        # enumerate函数用于在遍历spans列表时获取每个元素的索引(从0开始)
        for index, span in enumerate(spans):
            # 菜系
            cuisine = spans[0].text

            # 地址
            address = spans[1].text

        # 存储数据
        dic = {
            '店名': name,
            '评价': review_num,
            '人均': numbers,
            '菜系': cuisine,
            '地址': address
        }

        print(dic)


def main():
    # 创建字典保存数据
    dic = {}

    # 起始页
    num = 1

    # 伪造请求头
    headers = {
        'cookie': '_lxsdk_cuid=1911cc498eac8-0a9bb0ce26d609-26001e51-1fa400-1911cc498eac8; _lxsdk=1911cc498eac8-0a9bb0ce26d609-26001e51-1fa400-1911cc498eac8; _hc.v=a2438707-fd8b-2eb1-8201-db141f67078b.1722764532; fspop=test; s_ViewType=10; WEBDFPID=4u9z73uwu0xv5uu3073961156ux948x18088xx35z4y97958x3vz2080-2038124643497-1722764642744QQEGWKOfd79fef3d01d5e9aadc18ccd4d0c95078843; Hm_lvt_1099875750d85512c80065e2d3365ff4=1722764653; cy=1368; cye=enshi; logan_session_token=rx2feyfkqxnl4ya7fkmz; _lx_utm=utm_source%3Dgoogle%26utm_medium%3Dorganic; qruuid=2a0cdf84-2462-4f0e-b7bc-d65a03f0af19; dplet=751140961a88908057bdd6b5e1d57eed; dper=02029f21c63a9f697bfa9f0dc27d1e5e7061ba00c91d078774d4bcec06fea8d66ff915f6ce449cac5705667bfcb3a59839997cf1aeef6c8cd6b10000000001220000c39dd56319ee64d03a9bbf82be7768125a7a59640826d1c03f3c83e3323b185c53049d32498b4661e305b8ca6e33d386; ll=7fd06e815b796be3df069dec7836c3df; ua=%E7%82%B9%E5%B0%8F%E8%AF%849579146909; ctu=091da7d386a1953d055f05da823b041d3a55d58bde248d60d47bff7b7bf284e8; Hm_lvt_602b80cf8079ae6591966cc70a3940e7=1722764661,1722838891; HMACCOUNT=46EFA8661D7DADEA; Hm_lpvt_602b80cf8079ae6591966cc70a3940e7=1722842928; _lxsdk_s=19121135bb7-405-89b-78b%7C%7C292',
        'host': 'www.dianping.com',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
    }

    while num < 51:
        # 请求地址
        url = 'https://www.dianping.com/enshi/ch10/p' + str(num)

        # 调用函数
        work(dic, url=url, headers=headers)

        num += 1


if __name__ == '__main__':
    main()

项目效果

注意事项

完整复制代码爬到后面会报错,因为有些模块没有数据(鄙人有点懒,交给你们去完成这个任务了)

 

作者:Suc2es2

物联沃分享整理
物联沃-IOTWORD物联网 » Python爬虫实战案例:大众点评商家数据爬取指南

发表回复