python游走代码_爬虫-案例
前提:爬虫的实际例子
搜索引擎(百度、谷歌、360搜索等)。
伯乐在线。
惠惠购物助手。
数据分析与研究(数据冰山知乎专栏)。
抢票软件等。
为什么用Python写爬虫程序:
PHP:PHP是世界是最好的语言,但他天生不是做这个的,而且对多线程、异步支持不是很好,并发处理能力弱。爬虫是工具性程序,对速度和效率要求比较高。
Java:生态圈很完善,是Python爬虫最大的竞争对手。但是Java语言本身很笨重,代码量很大。重构成本比较高,任何修改会导致代码大量改动。爬虫经常要修改采集代码。
C/C++:运行效率是无敌的。但是学习和开发成本高。写个小爬虫程序可能要大半天时间。
Python:语法优美、代码简洁、开发效率高、支持的模块多。相关的HTTP请求模块和HTML解析模块非常丰富。还有Scrapy和Scrapy-redis框架让我们开发爬虫变得异常简单。
1、爬虫是啥?
通俗理解:爬虫是一个模拟人类请求网站行为的程序。可以自动请求网页、并数据抓取下来,然后使用一定的规则提取有价值的数据。
2、http协议里需要关注的
2.1 请求需要关注的东西 requests
url : 告诉浏览器,你要去哪里
Method:
get:
数据:url?key=value&key=value
post:
请求体:
form data
文件类型
json
headers:
cookie:保存用户登录状态
User-Agent:告诉服务器你是谁
refere:告诉服务器你从哪里来
服务器规定的特殊字段
2.2 请求需要关注的东西 response
Status Code:
2xx
请求成功(不一定)---后台程序员自己规定的---不能用作请求成功的唯一判断标准
3xx
重定向
响应头:
location:重定向地址
set_cookie:设置cookie
服务器规定的特殊字段
响应体:
1.html代码(css,html,js)
2.json
3.二进制(图片,视频,音频)
3、 常用请求库、解析库、数据库的用法
request库
安装:pip install requests
使用:
请求:
①get请求:
响应对象 = requests.get(......)
•**参数:**
•url:
•headers = {}
•cookies = {} 优先级低于headers里的cookie字段
•params = {}
•proxies = {'http':‘http://ip:端口’}
•timeout = 0.5
•allow_redirects = True
②post请求:
响应对象 = requests.post(......)
•**参数:**
•url:
•headers = {}
•cookies = {}
•data = {}
•json = {}
•files = {‘file’:open(...,‘rb’)}
•timeout = 0.5
•allow_redirects = False
自动保存cookie的请求:
session = requests.session()
•r = session.get(......)
•r = session.post(......)
补充:(保存cookie到本地)
import http.cookiejar as cookielib
session.cookie = cookielib.LWPCookieJar()
session.cookie.save(filename='1.txt')
session.cookies.load(filename='1.txt')
响应:
r.url
•r.text 常用
•r.encoding = 'gbk' 常用
•r.content 常用
•r.json() 常用
•r.status_code 用的少
•r.headers
•r.cookies
•r.history
3.2 常用解析语法
css选择器
1、类选择器
.类名
2、id选择器
#id值
3、标签选择器
标签名
4、后代选择器
选择器1 选择器2
5、子选择器
选择器1>选择器2
6、属性选择器
[属性名] #只要有这个属性名的,都会被选中
[属性名 = 属性值] #只要有这个属性名,并且值相等的,都会被选中
[class="xxx yyy "]
[属性名 ^= 值]
[属性名 &= 值]
[属性名*= 值]
7、群组选择器
选择器1,选择器2 or
8、多条件选择器
选择器1选择器2 and
p[pro="xxx"]
xpath选择器
略
3.3 牛逼的requests-html
安装:pip install requests-html
使用:
请求:
from requests_html import HTMLSession
•session = HTMLSession()
•**参数:**
•browser.args = [
•'--no-sand',
•'--user-agent=XXXXX'
•]
•响应对象 = session.request(......)
•响应对象 = session.get(......)
•响应对象 = session.post(......)
参数和requests模块一毛一样
响应:
r.url
•**属性和requests模块一毛一样
**
解析:
html对象属性:
r.html.absolute_links /xx/yy --> http://www....../xx/yy
•.links 路径原样
•.base_url 网站基础路径
•.html 解码过的响应内容 #相当于r.text
•.text
•.encoding = 'gbk' 控制的是r.html.html的解码格式
•.raw_html 相当于r.content
•.pq
html对象方法:
r.html.find('css选择器') [element对象,element对象...]
•.find('css选择器',first = True) 对一个element对象
•.xpath(‘xpath选择器’)
•.xpath('‘xpath选择器',first = True)
•.search(‘模板’) result对象(匹配第一次)
•(‘xxx{}yyy{}’)[0]
•(‘xxx{name}yyy{pwd}’)[‘name’]
•.search_all('模板') 匹配所有,[result对象,result对象,....]
•.render(.....) 渲染后的结果去替换 r.html.html
•**参数:**
•script:“”“ ( ) => {
•js代码
•js代码
•}
•”“”
•scrolldown:n
•sleep:n
•keep_page:True/False
绕过网站对webdriver的检测:
'''
() =>{
Object.defineProperties(navigator,{
webdriver:{
get: () => undefined
}
})
}
'''
Element对象方法及属性
element对象 .absolute_links
.links
.text
.html
.attrs
.find('css选择器')
.search('模板')
.search_all('模板')
与浏览器交互 r.html.page.XXX
async def xxx():
•await r.html.page.XXX
•session.loop.run....(xxx())
•.screenshot({'path':路径,'clip':{'x':1,'y':1,'width':100,'height':100}})
•.evaluate('''() =>{js代码}’‘’})
•.cookies()
•.type('css选择器',’内容‘,{’delay‘:100})
•.click('css选择器',{'button':'left','clickCount':1,'delay':0})
•.focus('css选择器')
•.hover('css选择器')
•.waitForSelector('css选择器')
•.waitFor(1000)
键盘事件r.html.page.keyboard.XXX
.down('Shift')
•.up('Shift')
•.press('ArrowLeft')
•.type('喜欢你啊',{‘delay’:100})
鼠标事件r.html.page.mouse.XXX
.click(x,y,{
'button':'left',
'click':1
'delay':0
})
.down({'button':'left'})
.up({'button':'left'})
.move(x,y,{'steps':1})
.
常用数据库
###mongoDB4.0:
安装:略
注意:使用前修改bin目录下配置文件mongodb.cfg,删除最后一行的'mp'字段
####1. 启动服务与终止服务
net start mongodb
net stop mongodb
2.创建管理员用户
mongo
use admin
db.createUser({user:"yxp",pwd:"997997",roles:["root"]})
3.使用账户密码连接mongodb
mongo -u adminUserName -p userPassword
4.数据库
查看数据库
show dbs
切换数据库
use db_name
增加数据库
db.table1.insert({'a':1}) 创建数据库(切换到数据库插入表及数据)
删除数据库
db.dropDatabase() 删数据库(删前要切换)
5.表
使用前先切换数据库
查看表
show tables 查所有的表
增加表
db.table1.insert({'b':2}) 增加表(表不存在就创建)
删除表
db.table1.drop() 删表
数据
增加数据
db.test.insert(user0) 插入一条
db.user.insertMany([user1,user2,user3,user4,user5]) 插入多条
删除数据
db.user.deleteOne({ 'age': 8 }) 删第一个匹配
db.user.deleteMany( {'addr.country': 'China'} ) 删全部匹配
db.user.deleteMany({}) 删所有
查看数据
db.user.find({'name':'alex'}) 查xx==xx
db.user.find({'name':{"$ne":'alex'}}) 查xx!=xx
db.user.find({'_id':{'$gt':2}}) 查xx>xx
db.user.find({"_id":{"$gte":2,}}) 查xx>=xx
db.user.find({'_id':{'$lt':3}}) 查xx
db.user.find({"_id":{"$lte":2}}) 查xx<=xx
改数据
db.user.update({'_id':2},{"$set":{"name":"WXX",}}) 改数据
pymongo
conn = pymongo.MongoClient(host=host,port=port, username=username, password=password)
db = client["db_name"] 切换数据库
table = db['表名']
table.insert({}) 插入数据
table.remove({}) 删除数据
table.update({'_id':2},{"$set":{"name":"WXX",}}) 改数据
table.find({}) 查数据
爬虫与反爬虫的对抗历史
常见反扒手段
1.检测浏览器headers
2.ip封禁
3.图片验证码
4.滑动模块
5.js加密算法
5.js轨迹
6.前端反调试
小爬爬
1.爬校花图片(模仿校花的都得死)
2.爬豆瓣电影
3.校花电影m3u8(凉凉夜色)
4.爬取天猫
反爬虫:使用技术手段防止爬虫程序的方法
误伤:反扒技术将普通用户识别为爬虫,如果误伤过高,效果再好也不能用
成本:反爬虫需要的人力和机器成本
拦截:成功拦截爬虫,一般情况下,拦截率越高,误伤率越高
5.分析腾讯视频url
mitmproxy基本用法:classXXX():defrequest(self,flow:mitmproxy.http.HTTPFlow):
捕获请求defresponse(self,flow: mitmproxy.http.HTTPFlow):
捕获响应
addons=[
Vip_film()
]
flow.request.headers----获取请求头
flow.request.url----获取请求url
flow.response.get_text()----获取响应体
flow.response.set_text()---- 设置响应体
运行:mitmdump -s 脚本.py
播放器:
;
给播放器传值:
var player = new TcPlayer('mod_player', {
"m3u8":m3u8播放地址,
"autoplay" : true, //iOS 下 safari 浏览器,以及大部分移动端浏览器是不开放视频自动播放这个能力的
"width" : '100%%',//视频的显示宽度,请尽量使用视频分辨率宽度
"height" : '100%%'//视频的显示高度,请尽量使用视频分辨率高度
})
6.登录知乎
保存cookie到本地
jsdom使用:
const jsdom = require("jsdom");
const { JSDOM }=jsdom;
const dom= new JSDOM(`
Hello world
`);
window=dom.window;
document=window.document;
XMLHttpRequest= window.XMLHttpRequest;
7.红薯小说(js注入)
script='''var span_list = document.getElementsByTagName("span")
for (var i=0;i
var content = window.getComputedStyle(
span_list[i], ':before'
).getPropertyValue('content');
span_list[i].innerText = content.replace('"',"").replace('"',"");
}'''
8、爬取天猫数据
问题:为什么访问天猫商品第一页数据时不需要登录,当选择下一页时就自动跳到登录页面?是什么机制实现这个原理的?
当访问第二页时自动跳转到登录的界面,检测cookie需要登录才能访问数据。关键字段s=60和sort=&,控制着登录,这是一个漏洞。
问题的关键切入点是分析第一页和第二页的url字段,有哪些不同。
第一页的url:
第二页的url:
必须手动选择跳过的页面,获取来获取url
点击确定,请求获取url:
得出结论:当把关键字段sort删除时,就不需要登录校验可以任意跳转到其他页面。
删除多余的字段信息进行访问也不需要登录直接跳转成功,并返回数据:
通过分析跳过登录,直接访问第八页的数据:
代码的实现原理:
get访问该url,去掉多余的字段,写个while循环,写个package页面的范围进行爬取商品数据信息,加入数据库MongoDB保存请求的数据信息,为了防止IP过度请求被封,在GitHub上调取代理池的接口。
python游走代码_爬虫-案例相关推荐
- python游走代码_介绍一个全局最优化的方法:随机游走算法(Random Walk)
1. 关于全局最优化求解 全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值.上一篇文章讲解了一个求解局部极小值的方法--梯度下降法.这种方法对于求解精度不高的情 ...
- python大作业代码_爬虫大作业(示例代码)
1.选一个自己感兴趣的主题(所有人不能雷同). 每天都有接触各大平台推送的新闻,了解到了校园外的大小事.故此,对新浪新闻标题的关键字的爬取,看看最近发生的实时,也想比较下标题党还是和实际内容的差异. ...
- 爬虫python下载文献代码_Python爬虫案例:爬取微信公众号文章
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 文章转载于公众号:早起Python 作者:陈熹 大家好,今天我们来讲点Selenium自动化,你是 ...
- python看不懂代码_爬虫参考,看不懂呀。
[python]代码库def get_label(name): if name in cats: return cats[name] return u'其它' def get_label_by_crc ...
- python爬小说代码_中文编程,用python编写小说网站爬虫
原标题:中文编程,用python编写小说网站爬虫 作者:乘风龙王 原文:https://zhuanlan.zhihu.com/p/51309019 为保持源码格式, 转载时使用了截图. 原文中的源码块 ...
- python新年有趣代码_搞几款由“Python”语言编写的“有趣、恶搞、好玩”的程序代码!...
下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代 ...
- python爬取天眼查存入excel表格_爬虫案例1——爬取新乡一中官网2018届高考录取名单...
有一种非常常见并且相对简单的网络爬虫,工作流程大概是这样的: 访问目标网页 提取目标网页内表格信息 写入excel文件并保存 初次实践,我决定尝试写一个这样的爬虫.经过一番构思,我准备把爬取新乡一中官 ...
- 小象学院python量化金融代码_机器学习_小象学院课件与案例代码
[实例简介]机器学习_小象学院课件与案例代码 [实例截图] [核心代码] 1.机器学习与数学分析.pdf 2.概率论与贝叶斯先验.pdf 3.矩阵和线性代数.pdf 4.Python_代码.zip 4 ...
- python二手交易平台代码_PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)...
说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...
最新文章
- eclipse设置工作空间编码为默认utf-8
- python的workbook_python openpyxl 操作 excel
- addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】
- [转]SQL SERVER数据库开发之触发器的应用
- spring源码:入口
- 计算机毕业设计之Android的图书馆借阅占座座位app(源码+系统+mysql数据库+Lw文档)
- 计算机设计大赛答辩ppt
- 【毕业设计全篇论文和源码】基于SSM的实体商城商户在线租赁以及信息管理系统的设计与实现(多人在线聊天室,微信扫码支付,在线签字,PDF合同在线生成,商户评分)
- 关于净推荐值(NPS)的理解
- day2_python年会抽奖游戏
- 离线语音合成使用——科大讯飞or云知音or百度语音
- BurpSuite2021 -- 目标模块(Target)
- Flutter高仿微信-第26篇-新的朋友
- c语言取余规则_这是我的C语言入门笔记
- 谈用户裂变,社群裂变的重要性
- error: ‘path_wts’ does not name a type
- GCP 搭建 tg代理 MTG
- QT 系列博客:为什么要用QT?
- 分布式系统之CAP和BASE理论
- VS2010项目转化为VS2008项目
热门文章
- Commom(十五)—— ShakeCamera摇晃摄像机
- 免688申请苹果开发者证书,开发自己得苹果应用
- PlatformIO平台下Arduino的开发过程-基于Visual Studio Code平台
- 国外大神 魔改灯泡主板 玩《毁灭战士》,太牛了!
- 终于在手机上玩到了原版大富翁(monoply)
- 网络基础-第一章:计算机网络分类
- pip 更新到最新的版本
- 財報中的HoH, YoY, MoM, QoQ是什麼意思?
- Phoenix 5.0 hbase 2.0 org.apache.hadoop.security.authentication.util.KerberosUtil.hasKerberosKeyTab
- CAN总线转光纤/CAN光端机在西门子FC18/720消防报警主机远距离联网解决方案