热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

玩Python爬虫的必备知识清单

玩Python爬虫的必备知识清单于2020-4-26重构可以指明学习路线与方向文章目录玩Python爬虫的必备知识清单你需要知道的基本概念你需要掌握的库你需要掌握的数据解析你需要掌
玩Python爬虫的必备知识清单

于2020-4-26重构

可以指明学习路线与方向


文章目录

  • 玩Python爬虫的必备知识清单
    • 你需要知道的基本概念
    • 你需要掌握的库
    • 你需要掌握的数据解析
    • 你需要掌握的数据存储


你需要知道的基本概念


通用爬虫:百度、谷歌搜索引擎

聚焦爬虫:根据特定需求,从特定网站爬取特定数据

爬虫工具:pycharm+anaconda+google chrome(其他浏览器也行)

http协议: 超文本传输协议, 是一种发布和接收HTML页面的方法

https协议:是http协议的加密版本,在http下加入了SSL层。服务器端口号是443端口

与浏览器交互过程:浏览器—>输入url-----get/post请求----->http服务器---->网站服务器----返回html---->http服务器---->用户浏览器【浏览器追加请求html引用的css、js、等动态文件】—…--->显示给用户

url:在浏览器中请求一个url,浏览器会对这个url进行一个编码。除英文字母,数字和部分符号外,其他的全部使用百分号+十六进制码值进行编码

get请求: 只从服务器获取数据

post: 向服务器发送数据(登录)、上传文件等,会对服务器资源产生影响

爬虫时有反爬机制即强制要求用某种请求,具体爬虫时用哪种请求根据情况而定

谷歌抓包:


你需要掌握的库

urllib

基本介绍

最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据,在Python3urllib库中,所有和网络请求相关的方法,都被集到urllib.request库上

urlopen函数

resp = request.urlopen('http://www.baidu.com')
print(resp.read())

返回值

​ http.client.HTTPResponse 对象,故此用response做接收

urlretrieve函数

from urllib import request request.urlretrieve('http://www.baidu.com/','baidu1.html')#将目标网页保存到本地

urlencode函数

from urllib import parse
data = {'name':'爬虫基础','greet':'hello world','age':100}
qs = parse.urlencode(data)
print(qs)
#编码为Unicode格式发送

parse_qs函数

from urllib import parse
qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
#print(resp.read().decode("utf-8"))如果抓取时以utf-8进行编码传输,用utf-8解码没问题,否之不然,应先了解网页的编码方式,一般通过抓包查取
print(parse.parse_qs(qs))//解码经过编码的url

{‘name’: [‘爬虫基础’], ‘greet’: [‘hello world’], ‘age’: [‘100’]}



request.Request类

反反爬必备伪装技术

#模拟请求头User-Agent,爬虫程序更像个浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
req = request.Request("http://www.baidu.com/",headers=headers)
resp = request.urlopen(req)
print(resp.read())


ProxyHandler处理器(代理设置)

为何使用:
固定某IP在某段时间内对网站服务器访问过多会被判定为非法访问,从而被限制或直接封掉

opener与handler

如需使用代理ip,则替代urlopen方法,使用如下系列操作方法

handler = request.ProxyHandler({"http":"218.66.161.88:31769"})opener = request.build_opener(handler)
req = request.Request("http://httpbin.org/ip")
resp = opener.open(req)
print(resp.read())

寻找可用的ip:西刺代理,快代理,或代理云 + ip检测工具(匹配可用id)




request
此库重写urllib的大多方法,比之前的常规方法做了更进一步封装,并且做了拓展

发送Get请求+

import requests
response = requests.get("http://www.baidu.com/")

import requestskw = {'wd':'中国'}headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s", params = kw, headers = headers)# 查看响应内容,response.text 返回的是Unicode格式的数据,如果传过来的数据是经过gbk编码的话,对能获得我们要的文本
print(response.text)# 查看响应头部字符编码,可以方便我们利用decode针对解码
print(response.encoding)

发送POST请求

response = requests.post("http://www.baidu.com/",data=data)

import requestsdata = {'first': 'true','pn': 1,'kd': 'python'
}resp = requests.post(url,headers=headers,data=data)
# 如果是json数据,直接可以调用json方法
print(resp.json())

代理设置

在请求的方法中(例如get或者post)传递proxies参数就可以了

import requestsurl = "http://httpbin.org/get"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
}proxy = {'http': '171.14.209.180:27829'
}resp = requests.get(url,headers=headers,proxies=proxy)
#保存为本地文件
with open('xx.html','w',encoding='utf-8') as fp:fp.write(resp.text)


共享曲奇饼(COOKIE)

如果使用requests,要达到共享COOKIE的目的,那么可以使用requests库给我们提供的session对象。以登录人人网为例,使用requests来实现。示例代码如下:

import requestsurl = "http://www.renren.com/PLogin.do"
data = {"email":"email@qq.com",'password':"pythonspider"}
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
}# 登录
session = requests.session()
session.post(url,data=data,headers=headers)# 访问大鹏个人中心
resp = session.get('http://www.renren.com/880151247/profile')print(resp.text)
#打印返回的Unicode文本


你需要掌握的数据解析


在从目标网站获得我们像要的数据后,我们需要从全站html中提取我们像要的数据,提取工具有(任选一种)

  • XPath+lxml库(√)
  • 美丽汤4(beautifulsoup4)
  • 正则表达式(√)



xpath

xpath(XML路径语言)是一门在XML和HTML文档中查找信息的语言,可用于XML和HTML文档中对元素和属性进行遍历。

你应该知道的节点关系

<bookstore><book><title>Harry Pottertitle><author>J K. Rowlingauthor><year>2005year><price>29.99price>
book>bookstore>

以上&#xff0c;book为&#xff0c;其中4个为&#xff0c;4个互为同胞&#xff0c;bookstore为其中所有元素的先辈

同理bookstore其中所有元素又为其后代元素

例子

<bookstore><book><title lang&#61;"eng">Harry Pottertitle> <price>29.99price>book><book> <title lang&#61;"eng">Learning XMLtitle> <price>39.95price>book>bookstore> bookstore>

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式&#xff1a;

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点&#xff0c;而不考虑它们的位置。
.选取当前节点。
选取当前节点的父节点。
&#64;选取属性。

在下面的表格中&#xff0c;列出了一些路径表达式以及表达式的结果&#xff1a;

bookstore选取 bookstore 元素的所有子节点。
/bookstore选取根元素 bookstore。注释&#xff1a;假如路径起始于正斜杠( / )&#xff0c;则此路径始终代表到某元素的绝对路径&#xff01;
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素&#xff0c;而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素&#xff0c;而不管它们位于 bookstore 之下的什么位置。
//&#64;lang选取名为 lang 的所有属性。

谓语

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中&#xff0c;我们列出了带有谓语的一些路径表达式&#xff0c;以及表达式的结果&#xff1a;

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<‘&#39;3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[&#64;lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[&#64;lang&#61;‘eng’]选取所有 title 元素&#xff0c;且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素&#xff0c;且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素&#xff0c;且其中的 price 元素的值须大于 35.00。


正则表达式

Python3爬虫之正则表达式与re库主要函数


你需要掌握的数据存储


经过爬取&#xff0c;解析&#xff0c;接下来我们要将我们想要的数据存储下来&#xff0c;我们有以下几种选择方案

  • json&#xff08;简单好用&#xff0c;强烈推荐&#xff09;
  • csv
  • excel
  • mysql(需要数据库基础)
  • mongoDB&#xff08;需要数据库基础&#xff09;


JSON

理想的数据交换语言&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成 &#xff0c; 并有效地提升网络传输效率 ,本质就是字符串

JSON在python中支持的数据类型

  1. 对象&#xff08;字典&#xff09;。使用{}。
  2. 数组&#xff08;列表&#xff09;。使用[]。
  3. 整形、浮点型、布尔类型还有null类型。
  4. 字符串类型&#xff08;字符串必须要用双引号&#xff0c;不能用单引号&#xff09;。

字典&#xff08;对象&#xff09;和列表&#xff08;数组&#xff09;转为JSON格式

使用json.dumps方法

import jsonbooks &#61; [{&#39;title&#39;: &#39;钢铁是怎样练成的&#39;,&#39;price&#39;: 9.8},{&#39;title&#39;: &#39;红楼梦&#39;,&#39;price&#39;: 9.9}
]json_str &#61; json.dumps(books,ensure_ascii&#61;False)
print(json_str)

因为jsondump的时候&#xff0c;只能存放ascii的字符&#xff0c;因此会将中文进行转义&#xff0c;这时候我们可以使用ensure_ascii&#61;False关闭这个特性。
Python中。只有基本数据类型才能转换成JSON格式的字符串。也即&#xff1a;intfloatstrlistdicttuple

将JSON字符串dump到文件中

json模块中除了dumps函数&#xff0c;还有一个dump函数&#xff0c;这个函数可以传入一个文件指针&#xff0c;直接将字符串dump到文件中。示例代码如下&#xff1a;

import json
books &#61; [{&#39;title&#39;: &#39;钢铁是怎样练成的&#39;,&#39;price&#39;: 9.8},{&#39;title&#39;: &#39;红楼梦&#39;,&#39;price&#39;: 9.9}
]
with open(&#39;a.json&#39;,&#39;w&#39;) as fp:json.dump(books,fp)
# a.json代表文件名 w代表以写的方式打开

json字符串转化成Python对象

使用json.load方法

import json
json_str &#61; &#39;[{"title": "钢铁是怎样练成的", "price": 9.8}, {"title": "红楼梦", "price": 9.9}]&#39;
books &#61; json.loads(json_str,encoding&#61;&#39;utf-8&#39;)
print(type(books))
print(books)

第一个打印输出结果为list列表类型

直接从文件中读取json并转化为python对象&#xff1a;

import json
with open(&#39;a.json&#39;,&#39;r&#39;,encoding&#61;&#39;utf-8&#39;) as fp:json_str &#61; json.load(fp)print(json_str)



推荐阅读
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 你根本不会用百度
    本文转载自第2大脑,详情可以扫描下方二维码关注该公众号摘要:教你正确使用百度。想必你的朋友圈这两天应该被《搜索引擎百度已死》这篇文章刷屏了吧࿰ ... [详细]
  • Python技巧:利用Cookie实现自动登录绕过验证码
    本文详细介绍了如何通过Python和Selenium库利用浏览器Cookie实现自动登录,从而绕过验证码验证。文章提供了具体的操作步骤,并附有代码示例,帮助读者理解和实践。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • ABBYY FineReader:高效PDF转换、精准OCR识别与文档对比工具
    在处理PDF转换和OCR识别时,您是否遇到过格式混乱、识别率低或图表无法正常识别的问题?ABBYY FineReader以其强大的功能和高精度的识别技术,完美解决这些问题,帮助您轻松找到最终版文档。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 智能医疗,即通过先进的物联网技术和信息平台,实现患者、医护人员和医疗机构之间的高效互动。它不仅提升了医疗服务的便捷性和质量,还推动了整个医疗行业的现代化进程。 ... [详细]
  • Python包管理工具pip的使用指南
    本文详细介绍了如何使用pip进行Python包的安装、管理和常见问题的解决方法,特别针对国内用户提供了优化建议。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 探讨了在 Spring MVC 框架下,JSP 页面使用 标签时遇到的数据无法正确显示的问题,并提供了可能的原因和解决方案。 ... [详细]
author-avatar
烟熏装-_265
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有