快速入门爬虫

一、什么是爬虫?

  通过编写程序模拟人浏览网页的行为,然后在互联网上抓取数据的过程。爬虫的价值如下:

  • 处于大数据时代,有更多有用的数据则更有利
  • 批量获取网络上的公开信息,能够提高工作效率

二、爬虫分类

  爬虫的种类如下表所示,

爬虫种类简介
通用爬虫 搜索引擎抓取系统重要组成部分,抓取整张网页数据
聚焦式爬虫 建立在通用爬虫的基础上,抓取页面中特定的局部内容
增量式爬虫 监测网站中数据更新的情况,只会抓取网站中最新更新的数据
深层网络爬虫主要用来爬取非静态网页,例如仅仅只有用户注册后才能显示的内容

  2.1 通用爬虫

   2.1.1 通用爬虫基础知识

   通用爬虫的步骤如下,
      (1) 指定url
         > UA(User-Agent)伪装,UA-为请求载体的身份标识
         > 请求参数处理
      (2) 向服务器发送请求-常用requests模块
         > requests.get()–>如,在浏览器中输入链接,按下回车属于get请求
         > requests.post()–>如,提交表单等属于post请求
      (3) 获取响应数据
      (4) 持久化存储

   2.1.2 实战演练一:爬取搜狗网页

import requests
# 指定rul
url = 'https://www.sogou.com/'

# UA伪装
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}

# 发起请求,get方法会返回一个响应对象
response = requests.get(url=url, headers=headers)

# 获取响应数据
page_text = response.text
print(page_text)

# 持久话存储
with open('./sogou.html', 'w', encoding='utf-8') as fp:
    fp.write(page_text)
print('爬取结束!')

   2.1.3 实战演练二:搜狗网页采集器

   采集搜狗引擎指定搜索关键词的网页,因此需要输入搜索关键词参数,而这些参数可以通过网络抓包的方式查看。具体如下所示,本文以搜狗引擎搜索关键字“爬虫”为例。
  (1) 首先对请求前后的网址进行分析, 搜狗首页网页地址如下:
      https://www.sogou.com/
  当输入关键词“爬虫”搜索时搜索结果的网页地址为:
      https://www.sogou.com/web?query=%E7%88%AC%E8%99%AB&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=6271&sst0=1630408012176&lkt=0%2C0%2C0&sugsuv=1629165356788438&sugtime=1630408012176
  通过对比发现,搜索结果网址搜狗首页网址多了很多内容,搜索结果网址问号(?)后面的内容为请求参数
  (2) 抓包分析请求链接,请求方式请求参数响应数据格式
  F5网页刷新快捷键,F12打开网页开发者模式快捷键,具体步骤如下所示。

  代码如下所示,

import requests
# 指定请求连接,将链接后面的请求参数删掉,改为由用户输入
url ='https://www.sogou.com/web?'

# 输入关键词,如“爬虫”
keyword = input('enter a word: ')

# 封装网页请求参数,不需要用户输入的参数默认即可
param = {
    'query': keyword
}

# 请求头
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}

# 对指定的url发起的请求,该函数会自动将请求参数与目标链接进行拼接
response = requests.get(url, params=param, headers=headers)

# 获取搜索结果网页内容
page_text = response.text

# 持久化存储
fileName = keyword + '.html'
with open(fileName, 'w', encoding='utf-8') as fp:
    fp.write(page_text)
print("保存成功!")

   2.1.4 实战演练三:爬取豆瓣电影喜剧排行榜电影

   在对相应数据进行爬取之前,还需进行网址和抓包分析,分析步骤如2.1.3所示。

# 爬取豆瓣喜剧排行榜电影,网址如下所示:
# https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=
import requests
import json

# 指定链接
url = 'https://movie.douban.com/j/chart/top_list'   # 通过抓包发现,服务器响应的喜剧列表为ajax请求

# UA伪装
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}

# 携带参数
param = {
    'type': 24,
    'interval_id': '100:90',
    'action': '',
    'start': '0',  # 从服务器中的第几部电影开始读取数据
    'limit': '20'
}

# 发起请求
response = requests.get(url, params=param, headers=headers)

# 获取响应数据,通过抓包发现其返回的响应数据为json格式
list_data = response.json()  # 返回一个转换后的对象

# 存储
fp = open('douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
print('over!!!')

  2.2 聚焦爬虫

   2.2.1 聚焦式爬虫基础知识

   聚焦式爬虫的步骤如下,
      (1) 指定url
         > UA(User-Agent)伪装,UA-为请求载体的身份标识
         > 请求参数处理
      (2) 向服务器发送请求-常用requests模块
         > requests.get()–>如,在浏览器中输入链接,按下回车属于get请求
         > requests.post()–>如,提交表单等属于post请求
      (3) 获取响应数据
      (4) 数据解析
      (5) 持久化存储

   数据解析方式如下所示,
      (1) 正则化表达式
      (2) bs4
      (3) xpath(通用性较强)
      (4) pyquery

   数据解析原理概述,
      (1) 进行标签定位
      (2) 提取标签或者标签中对应的属性中存储的数据值

   2.2.2 实战演练一:三国演义小说爬取(bs4解析)

# -*- coding: utf-8 -*-
import lxml
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }

    # 爬取首页信息
    url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    # page_text=requests.get(url=url,headers=headers).text
    response = requests.get(url=url, headers=headers)
    response.encoding = 'utf-8'
    page_text = response.text
    # 在首页中解析出章节标题和详情页的url
    # 1、实例化BeautifulSoup对象,且将网页源码传入到BeautifulSoup对象中
    soup = BeautifulSoup(page_text, 'lxml')
    # 2、解析章节标题和章节详情内容的url
    li_list = soup.select('.book-mulu > ul > li')
    # 文本文件相关
    fp = open('./三国演义.txt', 'w', encoding='utf-8')
    for li in li_list:
        title = li.a.string
        detail_url = 'http://www.shicimingju.com'+li.a['href']
        # 对详情页进行请求
        # detail_page_text=requests.get(url=detail_url,headers=headers).text
        detail_response = requests.get(url=detail_url, headers=headers)
        detail_response.encoding='utf-8'
        detail_page_text = detail_response.text
        # 解析出详情页中的相关的章节内容
        detail_soup = BeautifulSoup(detail_page_text, 'lxml')
        div_tag=detail_soup.find('div',class_='chapter_content')
        # 解析出的章节内容
        content=div_tag.text
        fp.write(title+':'+'\n'+content+'\n')
        print(title, "获取成功")
    print("三国演义爬取完成")

   2.2.3 实战演练二:58同城手房信息(xpath解析)

xpath解析步骤如下所示:
  (1). 实例化一个etree对象
    a). 将本地的html文档中的源码加载到etree对象中:etree.parse(filePath)
    b). 可以将直接从互联网中获取的源码数据加载到etree对象中:etree.HTML(‘page_text’)
  (2).  xpath(‘xpath表达式’)
    a) /表示从根目录上定位,且表示一个层级(绝对路径)
    b) //表示多个层级,相对路径。可以从任意位置开始定位
    c) 属性定位://div[@class=‘song’]
    d) 索引定位://div[@class=‘song’]/p[1]
    e) (//div[@class=‘tang’]//li[5]/a/text())[0]/text()获取标签的直系文本内容
    f) //text() 获取该标签下的所有的文本内容
    g)  /@attrName img/@src 获取标签属性值

from lxml import etree
import requests

# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}

# 指定url
url = 'https://cd.58.com/ershoufang/?from=esf&from=esf_list&PGTID=0d30000c-0006-63d0-5e97-fd6b8c12e5eb&ClickID=1'

# 对链接发起get请求
response = requests.get(url=url, headers=headers)
response.encoding='utf-8'

# 将网页源码存储到本地中
with open('58.html', 'w', encoding='utf-8') as fp:
    fp.write(response.text)
    
# 实例化etree对象,并将网页源码写入到etree对象中
tree = etree.HTML(response.text)
# 标签定位,找到section标签中class属性为list,且其下子标签class属性为property的div标签
div_tag = tree.xpath("//section[@class='list']/div[@class='property']")

# 遍历div标签,获取其中的文本内容
for div in div_tag:
    title = div.xpath("./a/div[2]/div[1]//h3/text()")
    print(title)

三、参考链接

  1、Python爬虫 8天快速入门 零基础小白到项目实战
  2、爬虫文档资料

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值