爬虫实战遇到的问题及解决汇总 / 爬虫原理介绍

文章目录

      • 一、如何写一个完整的爬虫程序?
          • 基本流程
          • 常用库介绍
      • 二、实战中常见错误类型及解决
          • 0、urllib 与 requests的区别
          • 1、urllib库在python2与python3的用法区别
          • 2、Instance of 'URLError' has no 'code' member
          • 3、Unexpected indent
          • 4、SyntaxError: invalid syntax
          • 5、UnboundLocalError: local variable 'xxx' referenced before assignment
          • 6、 python reload(sys)找不到,name 'reload' is not defined
          • 7、如何在github下载工程?
          • 8、如何打开从github下载的工程?
          • 9、报错AttributeError: 'NoneType' object has no attribute 'xpath'?
          • 10、TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
      • ———————————————————————————
      • 1)初识爬虫
          • 什么是爬虫?
          • 爬虫可以做什么?
          • 爬虫的本质是什么?
      • 2)爬虫的原理
          • 基本流程?
      • 3)入门常见问题解答
          • 关于抓取的页面数据和浏览器里看到的不一样的问题
          • Json (JavaScript Object Notation, JS 对象简谱)
          • JSON 与 JS 对象的关系
          • XPath(XML Path Language,即XML路径语言)
          • 正则表达式(简写regex、regexp或RE,Regular Expression又称规则表达式)
          • BeautifulSoup
          • PyQuery

一、如何写一个完整的爬虫程序?

基本流程

爬虫实战遇到的问题及解决汇总 / 爬虫原理介绍_第1张图片
(图源以及参考:python爬虫系列 https://www.jianshu.com/p/4424c7f36143)

爬虫的流程:请求网页 - 解析网页 - 提取网页数据 - 保存数据
(1)请求网页
(2)解析网页、提取数据的组合:bs4 + lxml 或者 lxml+xpath等
(3)保存数据

常用库介绍

二、实战中常见错误类型及解决

0、urllib 与 requests的区别

在模拟发起网络请求这一步中,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装,它们使用的主要区别:
requests可以直接构建常用的get和post请求并发起,urllib一般要先构建get或者post请求,然后再发起请求。
(urllib是内置的直接用,requests是第三方库要下载安装)

1、urllib库在python2与python3的用法区别

在python3.3后urllib2已经不能再用,只能用urllib.request来代替,其他变化点击这里

urllib四大组成模块:
(1)urllib.request——请求模块
(2)urllib.parse——url解析模块
(3)urllib.robotparser——robot.txt解析模块
(4)urllib.error——异常处理模块

2、Instance of ‘URLError’ has no ‘code’ member

解决:把URLError换成HTTPError
https://blog.csdn.net/weixin_41544534/article/details/86684857

3、Unexpected indent

解决:一般为缩进错误,python严格到只认一个tab或者四个空格

4、SyntaxError: invalid syntax

解决:
1、符号使用不正确,如半个括号(这个可能错误并不在标志行,前后找找对称括号);使用了中文符号;忘在if、elif、else、for、while、class、def声明末尾添加分号“:”
2、使用 “=”而不是 “==”
3、错误的使用缩进量。
记住缩进增加只用在以:结束的语句之后,而之后必须恢复到之前的缩进格式。

5、UnboundLocalError: local variable ‘xxx’ referenced before assignment

解决:
字面意思:局部变量赋值前被引用
原因:局部变量与全局变量同名
https://blog.csdn.net/onlyanyz/article/details/45009697?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

6、 python reload(sys)找不到,name ‘reload’ is not defined

一段python2.7的代码,里面有如下代码:

import sys
reload(sys)
sys.setdefaultencoding("utf-8")   #重新加载sys模块,并设置默认编码utf-8

在Python 3.x中运行提示:name ‘reload’ is not defined

python3.x下应该改为如下方式:

import importlib,sys
importlib.reload(sys)

最后一句sys.setdefaultencoding(“utf-8”) python3.x下就不需要了,默认编码就是utf-8

7、如何在github下载工程?

先登录——Fork——选择下载方式

8、如何打开从github下载的工程?

https://blog.csdn.net/Quest_sec/article/details/104030337

9、报错AttributeError: ‘NoneType’ object has no attribute ‘xpath’?

加一个头部就行了
headers={‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36’}
data = requests.get(url,headers=headers).text

10、TypeError: unsupported operand type(s) for +: ‘int’ and ‘tuple’

爬虫实战遇到的问题及解决汇总 / 爬虫原理介绍_第2张图片
这是一个类型错误,意思是说Python无法识别你使用的信息,Python发现你使用了一个int类型的变量要与str类型的相关联,“+”这个符号有相加的作用也有连接的作用,然后Python就不知道如何去处理了。

———————————————————————————

1)初识爬虫

什么是爬虫?

网络爬虫,又称网页蜘蛛,网络机器人,网页追逐者。蚂蚁、自动索引、模拟程序或蠕虫。
是一种按照一定的规则,自动地抓取万维网信息的程序或脚本。
通俗的讲,就是通过程序去获取web页面上自己想要的数据,即自动抓取数据。

爬虫可以做什么?

你能够通过浏览器访问的数据都可以通过爬虫获取。

爬虫的本质是什么?

模拟浏览器打开网页,获取网页中你想要的那部分数据。

浏览器打开网页的过程:
当你在浏览器输入地址后,经过DNS服务器找到服务器主机,向服务器发送一个请求,服务器解析之后发送给用户结果,包括html,js,css等文件内容,浏览器解析之后最后呈现给用户在浏览器上看到的结果。
即用户看到的浏览器结果就是由html代码构成的,而爬虫就是通过分析和过滤html代码,从中获取指定的资源(文本,图片,视频等)

2)爬虫的原理

请求,提取,自动化是爬虫的关键。

基本流程?

1.通过http库向目标站点发起请求Request

2.被服务器响应后获得响应内容Response, Response的内容即为要获取的页面内容。

3.解析内容
方法
1.直接处理
2.Json解析
3.正则表达式处理
4.BeautifulSoup解析处理
5.PyQuery解析处理
6.XPath解析处理

4.保存数据
途径
1.文本:纯文本,Json,Xml等
2.关系型数据库:如mysql,oracle,sql server等结构化数据库
3.非关系型数据库:MongoDB,Redis等key-value形式存储

3)入门常见问题解答

关于抓取的页面数据和浏览器里看到的不一样的问题

出现这种情况是因为,很多网站中的数据都是通过js,ajax动态加载的,所以直接通过get请求获取的页面和浏览器显示的不同。

如何解决js渲染的问题?

分析ajax
Selenium/webdriver
Splash
PyV8,Ghost.py

Json (JavaScript Object Notation, JS 对象简谱)

是一种轻量级的数据交换格式。
采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。

简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式,例如在 PHP 中,可以将 JSON 还原为数组或者一个基本对象。在用到AJAX时,如果需要用到数组传值,这时就需要用JSON将数组转化为字符串。

JSON 与 JS 对象的关系

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
XPath(XML Path Language,即XML路径语言)

它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。

正则表达式(简写regex、regexp或RE,Regular Expression又称规则表达式)

正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

BeautifulSoup

是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。利用它我们不在需要编写正则表达式就可以方便的实现网页信息的提取。

PyQuery

pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好,与BeautifulSoup差不多,都是用来解析的。但相比BeautifulSoup完美翔实的文档,PyQuery库的文档弱很多。
————————————————————————————————————————
参考:python修行路 - https://www.cnblogs.com/zhaof/p/

你可能感兴趣的