Crawler:关于爬虫的简介、安装、使用方法之详细攻略
Crawler:关于爬虫的简介、安装、使用方法之详细攻略
爬虫简介
1、在爬取一些简单的(没有反爬机制的)静态网页时,一般采取的策略是:选中目标(所谓的url链接),观察结构(链接结构,网页结构),构思动手(选用什么HTML下载器,解析器等)。在爬虫过程中,都会涉及到三种利器:
HTML下载器:下载HTML网页
HTML解析器:解析出有效数据
数据存储器:将有效数据通过文件或者数据库的形式存储起来
爬虫过程思路
1、将数据以字典形式建立
首先要知道,data里面的内容是都需要在代码中发送给服务器的。
Crawler:爬虫有道翻译
2、反爬虫机制
理解反爬虫机制,找出加密参数。大多数网站的反爬虫的机制是对向服务器提交表单的动态值进行加密,所以,我们每翻译一次,就观察data里面有哪些参数是动态变化的。从这个网址来看,参数salt、sign对应的值是动态变化。找出动态参数的实现方式。根据反爬虫经验可知,一般网站生成的反爬加密值都是采用的时间戳,以及将一下字符串使用加密算法加密一下,我们可以从网页源代码中进行查找理解。
(1)、伪装浏览器:在 HTTP Request 中加入特定的 Header 要加入 header,需要使用 Request 对象。对有些 header 要特别留意,服务器会针对这些 header 做检查。
- User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
- Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。常见的取值有:
- application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
- application/json : 在 JSON RPC 调用时使用
- application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用
- 在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务
(2)、调用代理访问
原因:一个合格的网站为了防止服务器负载过大,也应该设置这样的机制来限制频繁请求。很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
策略:
- 采用时间间隔(单个IP):为了防止一个IP访问过于频繁而造成的的拒绝访问,治标的方法是,在求请访问的时候设置一定的时间间隔。import time ...... time.sleep(10) ......
- 采用动态代理(多个IP):可以事先获取cn-proxy代理的IP地址,写到一个列表内,采用随机的方法获取不同的代理ip地址。
关于Python实现爬虫的一些包
requests、beautifulsoup 是爬虫两大神器,reuqests 用于网络请求,beautifusoup 用于操作 html 数据。有了这两把梭子,干起活来利索,scrapy 这样的爬虫框架我们就不用了,小程序派上它有点杀鸡用牛刀的意思。
1、requests
2、beautifulsoup
3、scrapy
关于爬虫常用的方法函数
1、基本函数
data = urllib.parse.urlencode(data).encode('utf-8')
#urllib.parse.urlencode方法:urllib库里面这个urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回的是:参数a=1&参数b=2 这样的字符串。
#encode方法:向网页post的数据格式必须为bytes类型(字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化),所以要转码。把字符串转车utf-8编码,然后把\x替换成%。如果你的终端是utf8编码的,那么要把结果再转成utf8输出,否则就乱码。
response = urllib.request.urlopen(url,data)
#urllib.request:以post的方式传输数据,可以用来发送request和获取request的结果。该模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。
# urllib.request.urlopen方法:给定网址url、post提交的数据data,来获取页面。urlopen() 方法,可以完成最基本的简单网页的 GET 请求抓取。如果传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 。
html = response.read().decode('utf-8')
# response.read方法:读取返回的数据
#decode方法:转换成str类型输出,将参数字典转化为字符串
target = json.loads(html)
#json.loads()用于将str类型的数据转成dict。
#json.load()用于从json文件中读取数据。
# json.dumps()用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数。
# json.dump()用于将dict类型的数据转成str,并写入到json文件中。
相关文章推荐
python3网络爬虫一《使用urllib.request发送请求》