0.爬虫基础流程

把爬虫的过程模块化,基本上可以归纳为以下几个步骤:

  • [√] 分析网页URL:打开你想要爬取数据的网站,然后寻找真实的页面数据URL地址;

  • [√] 请求网页数据:模拟请求网页数据,这里我们介绍requests库的使用;

  • [√] 解析网页数据:根据请求获得的网页数据我们用不同的方式解析成我们需要用的数据(如果网页数据为html源码,我们用Beautiful Soupxpathre正则表达式三种解析;若网页数据为json格式,我们可以直接用字典列表等基础知识处理)

  • [√] 存储网页数据:一般来说,解析后的数据是比较结构化的,可以保存为txt、csv、json或excel等文本,亦或者可以存储在数据库如MySql、MongoDB或SqlLite中。

1.分析网页URL

当我们有一个目标网站,有时候会发现对于静态网页,我们只需要把网页地址栏中的URL传到get请求中就可以直接取到网页的数据。但如果这是动态网页,我们便无法通过简单的传递网页地址栏的URL给get请求来获取网页数据,往往这个时候,我们进行翻页的时候还会发现网页地址栏中的URL是不会发生变化的。

接下来,我们来分别介绍这两种情况下如何获取真实的页面数据URL地址。

1.1 静态网页

对于静态网页来说,其实网页地址栏中的URL就是我们需要的。

以 贝壳二手房网(https://bj.ke.com/ershoufang/) 为例,我们可以看到进行翻页(如到第2页)的时候网页地址栏的URL变为了(https://bj.ke.com/ershoufang/pg2/)。类型这种情况,多半就是静态网页了,而且翻页的URL规律十分明显。

1.2 动态网页

对于动态网页来说,我们一般可以通过以下几个步骤找到真实URL地址:

  1. 需要按“F12”进入到浏览器的开发者模式;

  2. 点击“Network”—>XHR或JS或者你全部查找看;

  3. 进行翻页(可能是点击下一页或者下滑加载更多);

  4. 观察第2步中name模块的内容变化,寻找。

以 虎牙星秀区(https://www.huya.com/g/xingxiu) 为例,我们可以看到进行翻页(如到第2页)的时候网页地址栏的URL没有发生任何改变。

为了便于找到真实的URL地址,我们可以在开发者模式中找以下截图中的几点,preview是预览结果,可以便于我们进行匹配定位具体的Name

虎牙星秀区

当我们定位到具体的Name后,右侧选择Headers可以查看到请求网页需要的相关参数信息,而且比较好拟清其变化规律。以虎牙星秀为例,其真实URL地址及变化规律如下:

URL= 'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=1663&tagAll=0&page=2'

基础 url 地址如下:

url = 'https://www.huya.com/cache.php’

请求参数parames如下:

parames = {'m': 'LiveList','do': 'getLiveListByPage','gameId': 1663,'tagAll': 0,'page': 2, # 翻页变化的就是这个参数}

真实URL地址

2.请求网页数据

当我们确定了真实数据的URL后,这里便可以用requestsgetpost方法进行请求网页数据。

关于requests库的更多使用方式,大家可以前往(https://requests.readthedocs.io/zh_CN/latest/)查看。

2.1 发送get请求

In [1]: import requestsIn [2]: url = 'https://bj.ke.com/ershoufang/'In [3]: r = requests.get(url)In [4]: type(r)
Out[4]: requests.models.ResponseIn [5]: r.status_code
Out[5]: 200

我们得到的是一个Response对象,如果我们想要获取网页数据,可以使用textcontent属性来获取,另外如果获取的网页数据是json格式的则可以使用Requests 中内置的 **json()**解码器方法,助你处理json 数据。

  • r.text:字符串类型的数据,一般网页数据为文本类用此属性

  • r.content:二进制类型的数据,一般网页数据为视频或者图片时用此属性

  • r.json():json数据解码,一般网页数据为json格式时用此方法

对于一些动态网页,请求的网址是基础url和关键字参数组合而成,这个时候我们可以使用 params 关键字参数,以一个字符串字典来提供这些参数。

In [6]: url = 'https://www.huya.com/cache.php'...: parames = {...:     'm': 'LiveList',...:     'do': 'getLiveListByPage',...:     'gameId': 1663,...:     'tagAll': 0,...:     'page': 2, # 翻页变化的就是这个参数...:     }...: ...: r = requests.get(url, params=parames)In [7]: r.url
Out[7]: 'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=1663&tagAll=0&page=2'

2.2 发送post请求

通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

>>> payload = {'key1': 'value1', 'key2': 'value2'}>>> r = requests.post("http://httpbin.org/post", data=payload)

很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。

>>> import json>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}>>> r = requests.post(url, data=json.dumps(payload))

此处除了可以自行对 dict 进行编码,你还可以使用 json 参数直接传递,然后它就会被自动编码。

>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}>>> r = requests.post(url, json=payload)

2.3 定制请求头

在模拟请求时,如果不设置请求头的话是比较容易被网站发现是来自爬虫脚本,一些网站会对这种模拟请求进行拒绝。因此我们可以简单设置一下请求头做伪装,一般是设置浏览器。

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",}
r = requests.get(url, headers=headers)

其实,对于请求头还可以设置很多参数,具体大家可以在实际爬虫过程中在开发者模式看看里面的请求头模块进行分析处理。

虎牙星秀请求头

2.4 响应码

我们在 2.1 中看到获取响应码的是通过 r.status_code属性,一般来说如果 返回 数字 200,则表示成功获取了网页数据。

响应码分为五种类型,由它们的第一位数字表示:1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接受、理解和采纳 3xx:重定向,为了完成请求,必须进一步执行的动作 4xx:客户端错误,请求包含语法错误或者请求无法实现 5xx:服务器错误,服务器不能实现一种明显无效的请求

3.解析数据

上面有提到我们请求的网页数据有Html源码文本或者是json字符串文本,两者的解析方式不同。以下我们分别进行简单说明,大家在实际操作中视情况而定即可。

3.1 网页html文本解析

对于网页html文本来说,这里介绍Beautiful Soupxpathre正则表达式三种解析方法。

以贝壳二手房最新房源(https://bj.ke.com/ershoufang/co32/)为例,其html源码如下,我们通过get请求后的数据进行解析。

贝壳二手房

3.1.1 Beautiful Soup

关于Beautiful Soup库的更多使用方式,大家可以前往查看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)

首先安装pip install beautifulsoup4

我们将网页html文本内容r.text当作第一个参数传给BeautifulSoup对象,该对象的第二个参数为解析器的类型(这里使用lxml),此时就完成了BeaufulSoup对象的初始化。然后,将这个对象赋值给soup变量。

from bs4 import BeautifulSoup
import requestsurl = 'https://bj.ke.com/ershoufang/co32/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')

房源名称

获取房源的名称的代码如下:

# 获取全部房源 所在的节点
sellList = soup.find(class_="sellListContent")
# 获取全部房源节点列表
lis = sellList.find_all('li',class_="clear")
# 选取第一个房源节点
div = lis[0].find('div',class_="info clear")
# 采集房源名称
title = div.find('div',class_="title")
print(title.text)
明春西园 2室1厅 南 北

房源其他信息大家可以自己处理,强化学习!

3.1.2 xpath

XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。

首先安装lxmlpip install lxml

常见的规则如下:

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

首先导入 lxml 库的 etree 模块,然后声明一段 HTML 文本,调用 HTML 类进行初始化,成功构造一个 XPath 解析对象。

from lxml import etree
import requestsurl = 'https://bj.ke.com/ershoufang/co32/'
r = requests.get(url)
html = etree.HTML(r.text)

右键可获取xpath

通过copy获取的xpath://*[@id="beike"]/div[1]/div[4]/div[1]/div[4]/ul/li[1]/div/div[1]/a

# 获取 全部房源所在节点 ul,根据属性匹配精准查找
ul = html.xpath('.//ul[@class="sellListContent"]')[0]
# 获取房源列表
lis = ul.xpath('.//li[@class="clear"]')
# 选取第一个房源节点
li = lis[0]
# 获取其房源名称
li.xpath('./div/div[1]/a/text()')
['明春西园 2室1厅 南 北']

其他房源信息,大家可以自行处理,强化学习!

3.1.3 re正则

关于re正则解析网页html大家也可以前往查看此前发布的文章《对着爬虫网页HTML学习Python正则表达式re》。

# 找到房源名称所在的前后字符,然后组成正则表达式
re.findall(r'<a class="VIEWDATA CLICKDATA maidian-detail" title="(.*?)"',r.text,re.S)[0]
'明春西园 2室1厅 南 北'

3.2 json文本解析

在requests提供了r.json(),可以用于json数据解码,一般网页数据为json格式时用此方法。除此之外,还可以通过json.loads()和eval()方法进行处理,具体可以参考此前文章《Python爬取美团网数据这么简单,别再说你不会了哦!》。

json文本解析

url = 'https://www.huya.com/cache.php'
parames = {'m': 'LiveList','do': 'getLiveListByPage','gameId': 1663,'tagAll': 0,'page': 2, # 翻页变化的就是这个参数}r = requests.get(url, params=parames)
data = r.json()
type(data)
dict

如此解析后得到的数据就是字典,然后我们在看看字典中哪些字段是我们需要的,取出即可。

4.存储数据

当我们获取了到想要的数据后,便可以写入本地了。

对于文本类数据,可以通过csv模块或pandas模块进行写入到本地csv文件或excel文件;同时也可以用pymysql模块写入到数据库或者sqlite写入到本地数据库。

对于视频或者图片,可以open一个文件然后写入二进制内容后保存本地亦可。

关于存储数据大家可以结合实际案例进行学习。

Python应用实战- 爬虫基础入门知识必会相关推荐

  1. 学python需要什么基础知识-学习Python需要知道哪些基础入门知识?

    众所周知,Python以优雅.简洁著称,入行门槛低,可以从事Linux运维.Python Web网站工程师.Python自动化测试.数据分析.人工智能等职位!就目前来看,Python就业前景广阔.很多 ...

  2. Python Requests 丨爬虫基础入门

    据说:看我文章的帅帅 都有个习惯:先点赞.收藏再看 目录 ⚽️  一.背景知识:requests

  3. 视频教程-Python零基础入门高薪必看动画课程-Python

    Python零基础入门高薪必看动画课程 从事多年的Web应用开发,拥有10余年一线开发经验和教学经验.曾在中国银行从事数据采集服务,现专注于Python教学相关工作.参与过O2O外卖平台系统.微信商城 ...

  4. Python基础入门知识(2)

    接前面的文章: Python基础入门知识(1) Python基础入门教学 2 Python的基础知识 2.2 数据类型 2.2.2 数值类型 2.2.2.1 整数 2.2.2.2 浮点数 2.2.2. ...

  5. 结构化数据丨Python爬虫基础入门系列(7)

    提示:文末有福利!最新Python爬虫资料/学习指南>>戳我直达 文章目录 前言 JSON 1. json.loads() 2. json.dumps() 3. json.dump() 4 ...

  6. Urllib2库丨Python爬虫基础入门系列(12)

    提示:文末有福利!最新Python爬虫资料/学习指南>>戳我直达 文章目录 前言 Urllib2库 学习目的 urlopen GET请求方式 利用urllib2.Request类,添加He ...

  7. 超完整 Python基础入门知识教程

    本书旨在帮助Python开发人员发现该语言和相关库的突出特性,并编写简单.流畅.易于阅读和易于维护的代码.特别是生成器.属性描述符(ORM的键)和Python表达式的对象在数据库处理过程中的具体应用: ...

  8. python 3.x 爬虫基础---http headers详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---Requer ...

  9. 美女讲师教你学Python第一季:基础入门-秦红华-专题视频课程

    美女讲师教你学Python第一季:基础入门-448人已学习 课程介绍         本课程以最新的Python3为基础,面向Python编程语言的初学者: 精选教材,内容反复锤炼,精炼详实,既有实用 ...

最新文章

  1. 体质测试java代码_求java代码,要求做一个测试类,实现以下功能之一。最好三个功能都有。...
  2. MySpaces性能提高的过程(转)
  3. HNUSTOJ-1257 You are my brother
  4. c语言求上升沿次数,[求助]上升沿信号在C语言中怎么写啊
  5. 解决报表部署时数据源存在不能替换的问题
  6. linux+apache+mysql+php
  7. 从RedisTemplate中获得Jedis实例
  8. Rust LeetCode 练习:929 Unique Email Addresses
  9. 标准模板库(STL)学习探究之Multimap容器
  10. Java学习-Overload和Override的区别
  11. 一年前我在知乎上提了个愚蠢的问题:如何入门 Linux ?
  12. 当head遇上runat=server之后发生的纠结之事
  13. 面试官:有了 for 循环,为什么还要 forEach ??
  14. 服务器端 viewstate
  15. VIM 编辑器配置与使用
  16. Android 导入导出excel xls、xlsx
  17. vue项目实现百度离线地图开发
  18. pg 备份恢复(四)—— 逻辑备份(dump与copy导入导出)
  19. 三星a60android9,三星A6060官方港版安卓9固件rom线刷包:TGY-A6060ZHU1ASH3
  20. 开放PLM——Aras Innovator编程学习(一)简介

热门文章

  1. 光纤收发器如何选择?
  2. 工业以太网的优点有哪些?
  3. 工业以太网交换机和普通商用交换机的区别
  4. 【渝粤题库】国家开放大学2021春1032成本管理题目
  5. NB-IoT在智能锁领域的应用
  6. controll层跳转页面_java web开发中的各种层
  7. js清除添加的下拉框html,Html下拉框的定义以及JS、Jquary取值、添加和移除
  8. 【MFC系列-第22天】GDI算法实战——过渡色
  9. 【强化学习】Policy Gradients代码注释版本
  10. linux设置新硬盘权限,Linux 下挂载新硬盘以及更改为普通权限