Python爬虫相关

进程和线程

并发和并行

并发是同时具有多个活动的系统,实质是一个或多个物理CPU在若干道程序(或线程)之间多路复用。

并行是真正意义上的不同事件或线程在同一时刻同时执行。并行利用并发使系统运行更快,在操作系统的多个抽象层次运用。

进程

程序不能自己运行,只有将程序装载进内存,由系统分配资源后才能运行。程序是指令的集合,可以视为指令的静态文本,而进程是指令的执行活动,是动态的行为。
进程是操作系统对于一个运行中程序的抽象,是CPU、内存、IO设备的抽象。系统可以同时运行多个进程。

线程

线程是操作系统进行运算调度的最小单位,被包含于进程中,是进程的实际运作单位。一个进程可以由多个线程组成,线程之间共享代码和数据。
由于在实际网络服务器中对并行的需求,线程成为重要的编程模型:
1.多线程之间比多进程之间更易共享数据。
2.线程一般比进程高效。

深度优先和广度优先

在爬虫系统中,待抓取URL队列是很重要的一部分,待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取哪个页面,后抓取哪个页面。而决定这些URL排列顺序的方法,叫做抓取策略。以下是两种常用的策略:深度优先、广度优先。

深度优先

深度优先是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续追踪链接。

深度优先的爬取的顺序式:
A-B-D-E-I-C-F-G-H (递归)
算法(伪代码形式):

广度优先

广度优先,是指将新下载网页发现的链接直接插入到待抓取URL队列的末尾,也就是指网络爬虫会先抓取起始页中的所有网页,然后在选择其中的一个连接网页,继续抓取在此网页中链接的所有网页。

广度优先的爬取顺序为:
A-B-C-D-E-F-G-H-I (队列)
算法(伪代码形式):

Cookie和Session

简单的说就是当用户通过http协议访问一个服务器的时候,这个服务器会将一些Name/Value键值对返回给客户端浏览器,并将这些数据加上一些限制条件。在条件符合时,这个用户下次再访问服务器的时候,数据又被完整的带给服务器。
因为http是一种无状态协议,用户首次访问web站点的时候,服务器对用户一无所知。而Cookie就像是服务器给每个来访问的用户贴的标签,而这些标签就是对来访问的客户端的独有的身份的一个标识,这里就如同每个人的身份证一样,带着你的个人信息。而当一个客户端第一次连接过来的时候,服务端就会给他打一个标签,这里就如同给你发了一个身份证,当你下载带着这个身份证来的时候,服务器就知道你是谁了。所以Cookie是存在客户端的,这里其实就是在你的浏览器中。

Cookie分类

Cookie主要分为两种:
会话Cookie:不设置过期时间,保存在浏览器的内存中,关闭浏览器,Cookie便被销毁
普通Cookie:设置了过期时间,保存在硬盘上

Session

上面我们知道了Cookie可以让服务器端跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,如果 Cookie 很多,这无形地增加了客户端与服务端的数据传输量,而 Session 的出现正是为了解决这个问题。
同一个客户端每次和服务端交互时,不需要每次都传回所有的Cookie值,而是只要传回一个ID这个ID是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的ID,客户端只要传回这个ID就行了,这个ID通常是NANE为JSESIONID的一个Cookie。所以Session其实是利用Cookie进行信息处理的。

1
2
3
4
5
6
7
8
9
10
import re
import requests

resault = requests.get('http://120.24.86.145:8002/qiumingshan/')
re = re.requests(r'^<div>(.*)=\?;</div>$', resault.text,re.S|re.M|re.I)
value ={'value': eval(re.group(1))}

resault = requests.post('http://120.24.86.145:8002/qiumingshan/', data=value)
print('The Resault is:',eval(re.group(1)))
print(resault.text)

这样是错误的,会话无法维持。正确写法如下:

1
2
3
4
5
6
7
8
9
10
11
import re
import requests

search = requests.session()
resault = search.get('http://120.24.86.145:8002/qiumingshan/')
re = re.search(r'^<div>(.*)=\?;</div>$', resault.text,re.S|re.M|re.I)
value ={'value': eval(re.group(1))}

resault = search.post('http://120.24.86.145:8002/qiumingshan/', data=value)
print('The Resault is:',eval(re.group(1)))
print(resault.text)

用HTML测试网站httpbin.org举例:

1
2
3
4
import requests
requests.get("http://httpbin.org/cookies/set/number/123456")
response = requests.get("http://httpbin.org/cookies")
print(response.text)

结果:

1
2
3
4
5
import requests
s = requests.Session()
s.get("http://httpbin.org/cookies/set/number/123456")
response = s.get("http://httpbin.org/cookies")
print(response.text)

结果:

对于Cookie,因为人为的可分析本地Cookie进行Cookie欺骗,Session相对安全。而Session会一段时间内保持在服务器中,访问量越多越占用服务器性能。如果主要减轻服务器压力,Cookie相对合适。

HTML中form表单

登录页面会有一个form表单提交,form表单的功能是用于搜集不同类型的用户输入的内容。有了表单,网页的内容可以由用户自己创建。

获取authenticity_token信息后,可以获得Cookie信息,分析登录包获取提交地址,利用Scrapy爬虫框架等一步步实现通过爬虫程序登录网站。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2024 青域 All Rights Reserved.

UV : | PV :