Session、Cookie和Selenium
1.session
在计算机科学领域来说,尤其是在网络领域,会话(session,Microsoft Windows 中文版译作工作阶段)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在不包含会话层(例如UDP)或者是无法长时间驻留会话层(例如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。
2.cookie
Cookie,又称为“小甜饼”,类型为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
3.session与cookie的区别与联系
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
这里有一篇文章对session与cookie的机理与区别写的很好,放在下面(上面的区别与联系就是节选自这篇文章)
session与cookie到底有什么区别?
4.爬取IP代理
from bs4 import BeautifulSoup
import requests
import re
import json
def open_proxy_url(url):
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
headers = {'User-Agent': user_agent}
try:
r = requests.get(url, headers = headers, timeout = 10)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print('无法访问网页' + url)
def get_proxy_ip(response):
proxy_ip_list = []
soup = BeautifulSoup(response, 'html.parser')
proxy_ips = soup.find(id = 'ip_list').find_all('tr')
for proxy_ip in proxy_ips:
if len(proxy_ip.select('td')) >=8:
ip = proxy_ip.select('td')[1].text
port = proxy_ip.select('td')[2].text
protocol = proxy_ip.select('td')[5].text
if protocol in ('HTTP','HTTPS','http','https'):
proxy_ip_list.append(f'{protocol}://{ip}:{port}')
return proxy_ip_list
def open_url_using_proxy(url, proxy):
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
headers = {'User-Agent': user_agent}
proxies = {}
if proxy.startswith(('HTTPS','https')):
proxies['https'] = proxy
else:
proxies['http'] = proxy
try:
r = requests.get(url, headers = headers, proxies = proxies, timeout = 10)
r.raise_for_status()
r.encoding = r.apparent_encoding
return (r.text, r.status_code)
except:
print('无法访问网页' + url)
print('无效代理IP: ' + proxy)
return False
def check_proxy_avaliability(proxy):
url = 'http://www.baidu.com'
result = open_url_using_proxy(url, proxy)
VALID_PROXY = False
if result:
text, status_code = result
if status_code == 200:
r_title = re.findall('<title>.*</title>', text)
if r_title:
if r_title[0] == '<title>百度一下,你就知道</title>':
VALID_PROXY = True
if VALID_PROXY:
check_ip_url = 'https://jsonip.com/'
try:
text, status_code = open_url_using_proxy(check_ip_url, proxy)
except:
return
print('有效代理IP: ' + proxy)
with open('valid_proxy_ip.txt','a') as f:
f.writelines(proxy)
try:
source_ip = json.loads(text).get('ip')
print(f'源IP地址为:{source_ip}')
print('='*40)
except:
print('返回的非json,无法解析')
print(text)
else:
print('无效代理IP: ' + proxy)
if __name__ == '__main__':
proxy_url = 'https://www.xicidaili.com/'
proxy_ip_filename = 'proxy_ip.txt'
text = open(proxy_ip_filename, 'r').read()
proxy_ip_list = get_proxy_ip(text)
for proxy in proxy_ip_list:
check_proxy_avaliability(proxy)
怎么都是无效的代理啊~~
5.使用selenium爬取丁香园留言板(留的小作业哈哈哈~~~~~~)
import requests, json, re, random,time
from bs4 import BeautifulSoup
from selenium import webdriver
from lxml import etree
class getUrl(object):
"""docstring for getUrl"""
def __init__(self):
self.headers={
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8"
};
def run(self):
browser = webdriver.Chrome('F:/NewDesktop/spider/task3/chromedriver')
browser.get('https://auth.dxy.cn/accounts/login?service=http://www.dxy.cn/bbs/index.html')
time.sleep(1)
#切换账号密码登录表单
js1 = 'document.querySelector("#j_loginTab1").style.display="none";'
browser.execute_script(js1)
time.sleep(1)
js2 = 'document.querySelector("#j_loginTab2").style.display="block";'
browser.execute_script(js2)
#输入账号密码
input_name = browser.find_element_by_name('username')
input_name.clear()
input_name.send_keys('*')# 这里为自己账号和密码
input_pass = browser.find_element_by_name('password')
input_pass.clear()
input_pass.send_keys('*')
browser.find_element_by_xpath('//*[@class="form__button"]/button').click()
#此步骤应该有验证码,先跳过
time.sleep(10)
cookie = browser.get_cookies()
cookie_dict = {i['name']:i['value'] for i in cookie}
#转到抓取页面
browser.get("http://www.dxy.cn/bbs/thread/626626#626626");
html = browser.page_source
tree = etree.HTML(html)
user = tree.xpath('//div[@id="postcontainer"]//div[@class="auth"]/a/text()')
content = tree.xpath('//td[@class="postbody"]')
for i in range(0,len(user)):
result = user[i].strip()+":"+content[i].xpath('string(.)').strip()
#写入文件
dir_file = open("DXY_records.txt",'a', encoding="utf-8")
dir_file.write(result+"\n")
dir_file.write('*' * 80+"\n")
dir_file.close()
print('*' * 5 +"抓取结束"+'*' * 5)
if __name__ == '__main__':
geturl = getUrl()
geturl.run()
6.使用selenium爬取网易云音乐评论
张国荣的《这些年来》
参考博客:爬虫(七)通过Selenium爬取网易云音乐评论
from selenium import webdriver
driver = webdriver.Chrome()
url = 'https://music.163.com/#/song?id=29343376' # 歌曲页面的URL地址
driver.get(url)
driver.implicitly_wait(1) # 显式等待1秒
driver.switch_to.frame('contentFrame') # 切入contentFrame
comments_list = []
for i in range(10): # 爬取评论的页数
next_button = driver.find_element_by_xpath('//*[@class="m-cmmt"]/div[3]/div/a[11]') # 找到下一页的按钮
comments = driver.find_elements_by_xpath('//*[@class="m-cmmt"]/div[2]/div/div[2]/div[1]/div') # 找到评论
for item in comments:
index = item.text.index(':') + 1
comment = item.text[index:] # 解析评论
print(comment)
comments_list.append(comment)
driver.execute_script("arguments[0].click();", next_button) # 触发next_button的JS进入下一页评论
print(comments_list)