当前位置:AIGC资讯 > 数据采集 > 正文

使用python编写网络爬虫

使用python编写网络爬虫

前言 1、为何使用爬虫 2、编写爬虫的知识要求 3、确定爬虫使用的工具库 4、确定要获取的数据集 4.1 分析Url地址变化 4.2 获取目标数据集所在的HTML区域 5、开始爬取页面 5.1 模拟浏览器 5.2 获取目标HTML区域中的数据

前言

此篇文章是本人编写爬虫获取数据的心得体会,涉及到数据收集、数据预处理。对于数据存储、数据处理与分析、数据展示/数据可视化、数据应用部分请关注我的新文章。仅适用于新手python、爬虫入门。
特别说明:
**1、本篇内容仅供个人学习交流用,禁止作为商业用途。【转载请注明出处】 https://blog.csdn.net/qq_44092306/
2、本篇文章只是介绍爬虫的思路,对于引用的模块不做详细解释,模块详细解释请大家查阅其他资料。谢谢!

1、为何使用爬虫

简单的说,使用爬虫的目的就是为了降低工作量。举个例子,当我们需要获取一些信息的时候,这些信息存在于不同的网页上面,而且数据量巨大,单纯的靠人工去记录则会浪费很多时间和精力。这时,我们就可以使用爬虫作为工具去获取这些数据集,大大减少了机械性工作的时间。在大数据中,数据的获取往往离不开爬虫。

2、编写爬虫的知识要求

python基础知识:语法规则、控制语句、数据结构(字典、元组、列表)、函数 、模块 HTML基础、CSS基础、http、https协议 会灵活的字符串处理、数据结构的处理

3、确定爬虫使用的工具库

本人使用的python版本为3

from bs4 import BeautifulSoup
import requests
import lxml

4、确定要获取的数据集

资源定位:获取贝壳网中的二手房房源信息
说明: 我们在选择目标网址的时候,尽量选择正规,用户使用量多的网站,虽然会遇到一些反爬措施。小网站尽量不要爬,因为小网站的网页格式有些并不是固定的,当我们写了爬虫代码后,运行起来会发现不能够通用,从而使爬取复杂化。

要获取的数据集: 房源标题、楼盘名称、简介、价格 (其他数据项也可获取,这几项只是作为例子)

4.1 分析Url地址变化


通过浏览网页发现,底部有分页导航栏,点击下一页时,url变化为
https://jn.ke.com/ershoufang/pg2/
因此,首页为https://jn.ke.com/ershoufang/pg1/。至此url变化分析完毕。
分析URL地址变化的目的是: 通过request.get()方法循环这些url,获取到HTML页面元素

4.2 获取目标数据集所在的HTML区域

在目标网页上面点击F12进入开发者模式,我们只想取得房源信息,因此其他HTML均为无用数据,无需获取。我们所做的是尽量将目标区域缩小到最小范围。

通过分析,房源列表项所在区域均在<div data-componet=‘‘list’’>标签中,通过浏览发现,还可以继续缩小区域 。最终,目标区域缩小到

5、开始爬取页面

5.1 模拟浏览器

因为大部分的网站都有反爬取机制,所以我们需要让程序去模拟浏览器,通过设置代理和请求头,以及时间间隔,这几种方法可以避免大多数的网站把我们的请求挂掉。

# 请求头
    headers = {
        'User-Agent': 'Mozilla / 5.0(Windows NT 10.0Win64x64) AppleWebKit / 537.36(XHTML, likeGecko) Chrome '
                      '/ 11.1.1111.111Safari / 111.11'
    }
    # 设置代理 http-协议类型 101.4.136.34-代理ip  82-代理端口
    proxy = {'http': 'http://101.4.136.34:82'}
    r = requests.get(url, headers=headers, proxies=proxy)
    r.encoding = 'gbk' #设置编码格式
    context = r.text
    # 第一个参数表示被解析的html内容,第二个参数表示使用的解析器
    soup = BeautifulSoup(context, 'lxml')
  

请求头通过需要F12查看


选择Name中的一项,查看Headers,找到如下内容复制到代码里面即可

soup即为我们解析后的HTML网页,大家可以试着print(soup)看看是什么。
就是一个对应URL的HTML文档

5.2 获取目标HTML区域中的数据

通过前面的步骤,我们将数据集范围区域缩小到了<div class=‘‘info clear’’>标签中。现在我们可以获取到里面的内容了。

获取一页中所有的<div class=‘‘info clear’’>项
info_clear_all = soup.find_all('div', _class='info clear')
遍历info_clear_all 在迭代器的遍历范围内找到目标数据所在区域 获取目标数据区域的具体内容
具体代码如下:
from webbrowser import Mozilla
from bs4 import BeautifulSoup
import requests
import lxml
import random
import time

url = 'https://jn.ke.com/ershoufang/'


def getSoup(Url):
    # 设置请求头
    headers = {
        # headers中的内容为您浏览器的具体信息,请参考上述补充
    }
    # 设置代理 http-协议类型 101.4.136.34-代理ip  82-代理端口
    proxy = {'http': 'http://101.4.136.34:82'}
    r = requests.get(Url, headers=headers, proxies=proxy)
    # 获取网页的编码格式
    encode = r.encoding
    # 获取HTML网页
    context = r.text
    # 解析网页
    soup = BeautifulSoup(context, 'lxml')
    return soup


def getContext():
    soup = getSoup(url)
    # 获取<div class='info clear'></div>所有标签项
    info_clear_all = soup.find_all('div', class_='info clear')

    for a in info_clear_all:
        # 获取标题
        label_a_title = a.find('a', class_='VIEWDATA CLICKDATA maidian-detail')  # 获取标题所在的a标签
        title = label_a_title.attrs['title']  # 获取标题
        print('标题:'+title)
        # 获取楼盘名称
        positionInfo = a.find('div', class_='positionInfo')  # 缩小楼盘名称所在范围
        label_a = positionInfo.find('a')  # 获取<a>标签
        building_name = label_a.text  # 获取楼盘名称
        print('楼盘名称:' + building_name)
        # 获取楼盘简介
        houseInfo = a.find('div', class_='houseInfo')  # 获取简介所在的div范围
        introduce = houseInfo.text.replace(' ', '').strip().replace('\n', '')  # 获取简介
        print('楼盘简介:'+introduce)
        # 获取楼盘价格
        totalPrice = a.find('div', class_='totalPrice')  # 获取楼盘价格所在div范围
        price = totalPrice.text  # 获取楼盘价格
        print('楼盘价格:'+price+'\n')


if __name__ == "__main__":
    getContext()

运行结果

更新时间 2023-11-08