一、登录的基本原理
模拟登录是指使用程序模拟用户的行为来进行登录。登录有通用的原理,但是因为每个网站可能有不同的验证机制,因此模拟登录的具体实现方式各有不同。
通用的登录原理是:向服务器发送登录请求,服务端返回一个登录成功后的Cookie。在后续的请求中,需要该Cookie才能够获得登录后的页面内容。
import requests
login_url = "http://www.example.com/login"
data = {
"username": "myusername",
"password": "mypassword"
}
session = requests.Session()
response = session.post(login_url, data=data)
二、GET与POST请求的区别
Get和Post都是HTTP请求方法,使用GET和POST请求都可以发送数据。两者的区别在于:
- 数据位置:GET请求的数据在URL中,POST请求的数据在HTTP请求的Body中。
- 数据长度限制:GET请求的数据长度限制,取决于浏览器或服务器限制;POST请求的数据长度限制,取决于服务器限制。
- 请求对象:GET请求的请求对象是无状态的,也就是说,两次相同的GET请求返回的数据是相同的;POST请求的请求对象是有状态的,同一个POST请求的数据不同,返回的数据也会不同。
三、编写爬虫模拟登录示例
下面以西刺免费代理IP为例,演示使用Python模拟登录筛选高匿代理IP,并将其存入MongoDB的方法。
西刺网站登录的流程
首先,登录西刺网站需要输入用户名和密码,并且需要输入验证码。但是,由于验证码可能无法识别,因此我们可以使用已经登录成功的账号获取登录后页面的Cookie,直接使用该Cookie发送请求即可。
代码示例
import random
import re
import time
import requests
import pymongo
class XiciSpider(object):
def __init__(self, proxy_type='高匿', page_num=10):
self.proxy_type = proxy_type
self.page_num = page_num
self.session = requests.Session()
self.session.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
self.base_url = "https://www.xicidaili.com/nt/{}"
self.conn = pymongo.MongoClient("mongodb://localhost:27017/")
self.db = self.conn["proxies"]
self.collection = self.db["xici"]
self.cookies = self.get_cookies()
def get_cookies(self):
url = "https://www.xicidaili.com/nt/"
response = self.session.get(url)
cookies = response.cookies
return cookies
def get_proxy_list(self):
proxy_list = []
for page in range(1,self.page_num+1):
url = self.base_url.format(page)
response = self.session.get(url, cookies=self.cookies)
text = response.text
pattern = re.compile(r'<tr class.*?(.*?) .*?(.*?) .*?(.*?) .*?(.*?) .*?', re.S)
items = re.findall(pattern, text)
for item in items:
if item[3] == self.proxy_type:
proxy = {
"ip": item[0],
"port": item[1],
"protocol": item[2],
"proxy_type": item[3],
}
proxy_list.append(proxy)
time.sleep(random.uniform(1, 2))
return proxy_list
def check_proxy(self, proxy):
url = "http://icanhazip.com/"
proxies = {
"http": "http://{}:{}".format(proxy['ip'], proxy['port']),
"https": "https://{}:{}".format(proxy['ip'], proxy['port']),
}
try:
response = requests.get(url, proxies=proxies, timeout=5)
if response.ok:
return True
else:
return False
except requests.exceptions.RequestException:
return False
def save_to_mongo(self, proxy_list):
for proxy in proxy_list:
if self.check_proxy(proxy):
print("验证通过:{}:{} {}".format(proxy['ip'], proxy['port'], proxy['protocol']))
self.collection.update_one({"ip": proxy['ip']}, {"$set": proxy}, upsert=True)
else:
print("验证失败:{}:{}".format(proxy['ip'], proxy['port']))
def run(self):
proxy_list = self.get_proxy_list()
self.save_to_mongo(proxy_list)
if __name__ == '__main__':
spider = XiciSpider()
spider.run()
四、小结
模拟登录是Web爬虫的基础知识之一,对于具有登录机制的网站,模拟登录可以获取更多的数据。Python中有很多Web框架和网络库可以使用,有了基本的理论知识和实践技能,可以调用这些强大的工具进行更高效的数据爬取。
原创文章,作者:RZFV,如若转载,请注明出处:https://www.506064.com/n/150119.html
微信扫一扫
支付宝扫一扫