爬虫
爬虫过程
- 获取网络数据:requests\selenium
- 浏览器伪装
- 登录反爬
- 代理ip
- 解析数据(从获取到的网络数据中提取有效文件):正则表达式、基于css选择器的解析器(bs4)、基于xpath的解析器(lxml)
- 保存数据
网页 - html、css(css选择器)
爬虫
获取公开的网络数据。
数据来源:网站对应网页、手机APP
爬虫流程
获取网络数据(requests、selenium)
解析数据,从获取到的网络数据中提取有效数据 (正则、bs4、lxml)
保存数据(csv、excel、数据库等)
requests
Python获取网站数据的第三方库(基于http或https协议的网络请求)。
使用requests场景
- 直接请求网络地址。
- 对提供网页数据的接口发送请求。
requests基本用法
requests.get(网页地址) | 获取指定页面数据返回一个响应对象 |
---|---|
响应对象.status_code | 获取响应状态码 |
响应对象.headers | 获取响应头 |
response = requests.get('https://cd.zu.ke.com/zufang')
print(response) # <Response [200]> 200 - 请求成功
# 获取响应的状态码
print(response.status_code)
if response.status_code == 200:
pass
# 获取响应头
print(response.headers)
请求内容
返回真正有用的数据。
response.content | 二进制数据(图片、音频、视频) |
---|---|
response.text | 字符串类型数据 |
response.json | 对内容进行json解析后的数据(json数据接口) |
网页
前端开发
写互联网产品页面(电脑端应用程序除外)。
前端开发相关技术 - html、css、js(原生js、JQuery、Vue、React)
html | 负责网页内容 |
---|---|
css | 负责网页内容样式及布局 |
js | 负责网页内容变化 |
html
以标签为单位给网页提供内容,不同标签可以提供不同内容。
标签语法结构
<!--
1.双标签:<标签名 属性名=属性值1 属性名2=属性值2 ...>标签内容</标签名>
2.单标签:1.<标签名 属性名=属性值1 属性名2=属性值2 ...>
2.<标签名 属性名=属性值1 属性名2=属性值2 .../>
-->
css
操作网页内容样式,美观网页。
语法
选择器{属性1:属性值1;属性2:属性值2…}
选择器
-
元素选择(标签选择) - 标签作为选择器,选中所有指定标签。
p{} - 选中所有p标签。
a{} - 选中所有a标签。
p{ color: red; font-size: 30px; } </style> <p>我是段落1</p> <!-- 选中了 --> <a href="">我是超链接1</a> <div>我是div1</div> <a href="">我是超链接2</a> <p>我是段落2</p> <!-- 选中了 -->
-
id选择器 - 在id属性值前面加**#**作为选择器,选中id属性值为指定值的标签。(每个可见标签都可以设置id属性,一个页面中同一个id值只有一个标签)
#p2 - 选中id属性值为p2的标签。
<style> #p2{ color: green; background-color: yellow; } </style> <p>我是段落1</p> <a href="">我是超链接1</a> <div>我是div1</div> <a href="">我是超链接2</a> <p id="p2">我是段落2</p> <!-- 选中了 -->
-
class选择器 - class属性值前面加**.**作为一个选择器,选中class属性值为指定值的标签。不同标签可以有相同class值,同一标签可以有不同class值。
.c1 - 获取class值为c1的所有标签。
p.c1 - 获取class值为c1的p标签。
.c1.c2 - 获取class值同时为c1和c2的标签。
-
群组选择选择器 - 将多个选择器用逗号隔开作为一个选择器。
p,a{} - 选择所有的p标签和所有的a标签。
#p1,.c1,p{} - 选择id为p1的标签和class为c1标签以及所有的p标签。
-
子代选择器 - 多个选择器用>隔开作为一个选择器
div>p{} - div的儿子p
<style> div>p{ font-size: 30px; } </style> <p>我是段落1</p> <div> <p>我是段落2</p> <!-- 30px --> <span> <p>我是段落5</p> </span> </div> <div id="box1"> <p>我是段落3</p> <!-- 30px --> <div> <span> <div> <p>我是段落4</p> <!-- 30px --> </div> </span> </div> </div>
-
后代选择器 - 多个选择器用空格隔开作为一个选择器
div p{} - div的后辈p
div p{
background-color: yellow;
}
<p>我是段落1</p>
<div>
<p>我是段落2</p> <!--background-color: yellow -->
<span>
<p>我是段落5</p> <!--background-color: yellow -->
</span>
</div>
<div id="box1">
<p>我是段落3</p> <!--background-color: yellow -->
<div>
<span>
<div>
<p>我是段落4</p>
</div>
</span>
</div>
</div>
--background-color: yellow -->
</span>
</div>
<div id="box1">
<p>我是段落3</p> <!--background-color: yellow -->
<div>
<span>
<div>
<p>我是段落4</p>
</div>
</span>
</div>
</div>