Python 爬虫 (一)
爬:
爬一个网站需要几步?
-
-
根据需求,寻找网址
-
读取网页
-
urllib request
-
requests
-
-
定位并提取数据
- 正则
- xpath
- beautiful soup
-
存储数据
-
mysql
-
redis
-
文件存储
爬取百度首页:(确定用户需求)
from urllib import request
url = 'http://www.baidu.com'#确定网页
response = request.urlopen(url)#打开网页
html = response.read()#读取网页内容
with open('baidu.html','wb') as f:#将内容存储到本地
f.write(html)
cookie和session之间的爱情故事:
啥是cookie:
当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie,里的内容来判断使用者,送出特定的网页内容给你。
cookie机制:
正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用
是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围,大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
什么是session:
当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
session机制:
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存
cookie和session机制之间的区别与联系
一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
封装请求网页的两种方法:post 和 get
以百度翻译为例:
1 from urllib import request,parse 2 from urllib.error import HTTPError,URLError 3 4 5 def get(url,headers = None): 6 return url_requests(url,headers=headers) 7 def post(url,form,headers=None): 8 return url_requests(url,form,headers=headers) 9 10 def url_requests(url,form = None,headers = None): 11 user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' 12 13 if headers == None: 14 headers = { 15 'User-Agent':user_agent 16 } 17 html_b = b'' 18 19 try: 20 #post请求 21 if form: 22 #通过requests 传入data来实现post请求 23 #先用parse模块将form转为字符串 24 form_str = parse.urlencode(form) 25 # print(form_str) 26 #再将str转换为bytes 27 form_b = form_str.encode('utf-8') 28 # print(form_b) 29 req = request.Request(url,data=form_b,headers=headers) 30 else: 31 req = request.Request(url,headers=headers) 32 response = request.urlopen(req) 33 html_b = response.read() 34 except HTTPError as e: 35 print(e) 36 except URLError as e: 37 print(e) 38 return html_b 39 40 if __name__ == '__main__': 41 url = 'http://fanyi.baidu.com/sug' 42 form = { 43 'kw': '哈哈' 44 } 45 html_bytes = post(url, form=form).decode('utf-8') 46 print(html_bytes) 47 48 49 # url = 'http://www.baidu.com' 50 # html_byte = get(url).decode('utf-8') 51 # print(html_byte)