爬虫原理
一. 普通网站php就可以实现爬虫
1. 首先获取网站的cookie
/**
* 模拟登录
* string $url 提交链接
* string $cookies 设置cookie信息保存在指定的文件夹中
* string $post 参数
* 过CURL模拟登录并获取数据一些网站需要权限认证,必须登录网站后,才能有效地抓取网页并采集内容,这就需要curl来设置cookie完成模拟登录网页
*/
function login_post_cookie($url, $cookie, $post){
$ch = curl_init(); //初始化curl模块
curl_setopt($ch, CURLOPT_URL, $url); //登录提交的地址
curl_setopt($ch, CURLOPT_HEADER, 0); //是否显示头信息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //是否自动显示返回的信息
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //跟踪重定向页面
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); //设置cookie信息保存在指定的文件夹中
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //发送
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //SSL 报错时使用
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //SSL 报错时使用
curl_setopt($ch, CURLOPT_POST, 1); //以POST方式提交
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));//要执行的信息
$rs = curl_exec($ch); //执行CURL
// if(curl_errno($ch)){
// echo 'Curl error: '.curl_error($ch);exit(); //这里是设置个错误信息的反馈
// }
curl_close($ch); //关闭会话
return $rs; //返回字符串
}
2.通过使用cookie来操作获取网站数据
/**
* 提交get表单功能
* string $url 提交链接
* string $cookies cookies
*/
function submit_get_content($url='', $cookies=''){
$ch = curl_init(); //初始化curl模块
curl_setopt($ch, CURLOPT_URL, $url); //登录提交的地址
curl_setopt($ch, CURLOPT_HEADER, 0); //是否显示头信息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //是否自动显示返回的信息
// curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //跟踪重定向页面
curl_setopt($ch, CURLOPT_COOKIE, $cookies);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //SSL 报错时使用
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //SSL 报错时使用
$rs = curl_exec($ch); //执行curl转去页面内容
curl_close($ch);
return $rs; //返回字符串
}
二. 有验证码,滑动解锁等网站的爬虫(如阿里华为微博等网站)
1. 安装python环境
通过python+selenium+chrome 模拟操作登录,
# coding:utf-8
from selenium import webdriver
# 鼠标行为
from selenium.webdriver.common.action_chains import ActionChains
# 加载PHANTOMJS
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# 时间 json
import time,json
# 正则
import re
import requests as curl
# Chrome
# 进入浏览器设置
options = webdriver.ChromeOptions()
# 设置中文
options.add_argument('lang=zh_CN.UTF-8')
# 更换头部
# options.add_argument('--headless')
# options.add_argument('--disable-gpu')
options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"')
driver = webdriver.Chrome(chrome_options=options)
# 调整最大窗口,否则某些元素无法显示
driver.maximize_window()
driver.get("//想要爬取的网站的登录页")
# 等待滑动模块和其他JS文件加载完毕!
time.sleep(3)
#这一块写对应网站的登录逻辑,不同网站的登录逻辑不同,请自行编辑 start
#这一块写对应网站的登录逻辑,不同网站的登录逻辑不同,请自行编辑 end
driver.find_element_by_class_name("fm-submit").click()
time.sleep(5)
# 我的客户 页面 cookies
driver.get("//想要爬取的网站的页面")
time.sleep(5)
# 存取cookies
cookies_content = driver.get_cookies()
with open("cookies.txt", "w") as fp:
json.dump(cookies_content, fp)
# 退出浏览器,如果浏览器打开多个窗口,可以使用driver.close()关闭当前窗口而不是关闭浏览器
driver.quit()
# 读文件
def readFile(filename):
try:
fp = open(filename, 'r');
fBody = fp.read()
fp.close()
return fBody
except:
return False
import json
cookie= readFile('cookies.txt')
if not cookie :
str = {'code': 0, 'msg': '获取cookies失败'}
else:
str = {
'code': 1,
'msg':'获取成功',
'cookie':cookie,
'key':'nish',
}
# 发送给自己的机器存起来
url = "http://www.onlyni.com/api.php/api/upload_cookie"
res = curl.post(url,data=str)
print(res.text)
2.再通过使用cookie来操作获取网站数据就可以实现
注意事项
1.很多网站会在请求header中添加token等字段,会对这些字段做判断。
这些就需要先获取到这些token,再把token放入header中获取
2.cookie需要一直获取,正常一个小时以后就会失效