python爬虫入门01:教你在 Chrome 浏览器轻松抓包


通过


python爬虫入门:什么是爬虫,怎么玩爬虫?


我们知道了什么是爬虫


也知道了爬虫的具体流程


那么在我们要对某个网站进行爬取的时候


要对其数据进行分析


就要知道应该怎么请求


就要知道获取的数据是什么样的


所以我们要学会怎么抓咪咪!



哦,不对。


我们要学会怎么数据抓包


虽然小馒头也是包的一种


ok…anyway…


打开我们的 Chrome 浏览器


在这里 小帅b 提醒大家一句


尽量不要用国产浏览器


很多是有后门




所以


Chrome 是首选!


ok,打开 Chrome 浏览器之后呢


我们随便输入一个网址吧


比如


www.pornhub.com




营养跟不上?那就…


输入一个人人都能上的网站


www.baidu.com


用力回车


一个熟悉的页面显示在你的面前





这个时候,你按下 F12


你可以看到弹出一个有点装逼的窗口




这个玩意


正是我们想要的


可以看到


Element 标签下对应的 HTML 代码


其实就是这个网页的代码


我们可以在这里除了看看它的代码之外


我们还可以修改一些东西


比如我把这个按钮改成小帅b




按下回车




是不是瞬间逼格满满


哦,不好意思


今天不是要说怎么装逼的



我们点击 Network 这个标签


然后刷新一下


可以看到有很多的请求




HTTP 的请求方式有好几种


GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE


不过最常见的就是 GET 和 POST 请求


咱们就一一说道说道




接下来就是


学习 python 的正确姿势




我们直接搜索「苍老师


然后我们就可以发现


有好多请求



这些都是 GET 请求


我们随便点击一个请求进去



可以看到我们的请求URL


https://www.baidu.com/s?wd=%E8%8B%8D%E8%80%81%E5%B8%88&rsv_spt=1&rsv_iqid=0xad707ee600011b25&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&oq=%25E8%258B%258D%25E8%2580%2581%25E5%25B8%2588&rsv_t=5d8eqNDy4ZpyUOz7ByzyIMYfH5Jc7861dr4CFQaY3WCiDnOpBLob6Eouk23%2F3L%2BTD46O&rsv_sug3=15&rsv_pq=996e776f0000df06&rsv_sug4=19123


在 ?后面的这些 jb 玩意儿


就是 GET 请求的参数


这些参数以「键值对」的形式实现


比如这里的


wd=%E8%8B%8D%E8%80%81%E5%B8%88


就是告诉百度


我们要查询的是苍老师相关的内容


这种方式的请求方式是最简单的


所以以后我们在 Python 写 GET 请求的时候


直接在 URL 后面加个 ?然后添加参数值就好了


比如


我要百度搜索波多野结衣


那么就是


https://www.baidu.com/s?wd=波多野结衣


不信你直接在浏览器这样搜


是一毛一样的


那么,啥是 POST 请求呢?


我们在做一些信息提交的时候


比如注册,登录


这时候我们做的就是 POST 请求


POST 的参数不会直接放在 URL 上


会以 Form 表单的形式将数据提交给服务器




我们来登录一下百度



当我们点击登录的时候


就开始将我们的账号密码请求给百度服务器


可以看到我们请求了 login 这个接口


请求方法就是 POST



而我们的请求参数是以 Form 表单的方式提交的



拉到下面就可以看到


username 就是 xiaoshuaib

而密码,就是被加密了的


这些都是 POST 参数


可以发现


GET请求把请求参数都暴露在URL上


而POST请求的参数放在request body 里面


POST请求方式还对密码参数加了密


这样就相对安全一些



ok


你已经了解请求方式了


接下来说说请求头




当然说的不是上面这个 gou 头哈


我们刚刚在访问百度的时候


可以看到这个玩意



这个就是请求头


Request Header


我们在做 HTTP 请求的时候


除了提交一些参数之外


我们还有定义一些 HTTP 请求的头部信息


比如 Accept、Host、cookie、User-Agent等等


这些参数也是我们在做爬虫要用到


通过这些信息,欺骗服务器,告诉它我们是正规请求


比如


我们可以在代码里面设置 cookie 告诉服务器我们就是在这个浏览器请求的会话


User-Agent 告诉服务器我们是浏览器请求的




说完我们这边的请求了


接着我们再说说服务器的响应


你一定遇到过 404 页面吧


或者服务器错误返回个 502 吧





这些 404 啊,200啊,301啊,502啊


都是服务器的响应码


一般服务器给我们返回 200


那就说明


我们成功请求了





再来说说响应头




当我们请求成功之后


服务器会给我们返回响应码之外


还有响应头


这个头主要是告诉我们数据以什么样的形式展现


告诉我们cookie的设置


还有一个


就是响应体


说白了,就是服务器返回给我们的数据


我们点击 Response 就可以看到相关的数据了



看,这些就是服务器返回给我们的 HTML 源代码


对于不同的请求


我们获取到的数据是不一样的


除了 HTML的,也有 JSON 的


图片二进制数据等等


可以针对不同的情况


用不同的手段来解析这些数据



说到这里


想必你已经会在 Chrome 抓包


所谓抓包


就是我们摸清了浏览器里面的套路


知道它是怎么搞的


那么通过我们的请求


GET 请求也好


POST 请求也罢


只要知道请求方式


只要知道请求参数


只要知道请求头定义


只要知道怎么拿到返回的数据


这..


对我们来说


爬虫还难么?




完了!


爽吗?


那还不把这个公众号设置为「星标」?


那还不转发


那还不点好看







那就赶紧扫一扫

加入pythonner的聚集地

我们一起从装逼到牛逼



近期文章


对不起,我不应该出轨的!


python爬虫入门:什么是爬虫,怎么玩爬虫?






python爬虫25 | 爬取下来的数据怎么保存? CSV 了解一下


大家好


我是小帅b


是一个练习时长两年半的练习生


喜欢


唱!


跳!


rap!


篮球!


敲代码!


装逼!



不好意思


我又走错片场了


接下来的几篇文章


小帅b将告诉你


如何将你爬取到的数据保存下来


有文本文件、redis、数据库(MySQL、MangoDB)等的存储方式


今天先说说


CSV


什么是 CSV?

怎么玩?

牛逼么?


那么接下来就是


学习 python 的正确姿势





CSV 是一个文本文件来的


有点像 excel


也就是它是以一定的表格的格式来展示数据的


我们通常会使用逗号(,)来对每一个单元数据进行分割


分隔符不止是逗号


也可以是制表符(tab)、冒号(:)、分号(;)


比如我们要来表示一个表格中的数据


就可以这样


1列的名称,第2列的名称,第3列的名称1行第1格的数据,第1行第2格的数据,第1行第3格的数据2行第1格的数据,第2行第2格的数据,第2行第3格的数据


这就是 CSV 的格式



有啥好处呢


说 3 点足以


它支持存储比较大量的数据


我们可以非常方便地利用它进行数据的导入或者导出到电子表格或者数据库


所有支持文本文件的输入输出的编程语言(比如我们的 python),都可以直接操作使用 CSV 文件。





了解什么是 CSV 之后


接下来小帅b会告诉你怎么使用 python 去存储数据到 CSV 文件中


代码走起



我们导入 CSV 这个库


通过 csv.DictWriter 获取 writer 对象


然后就可以写入了


具体看下代码


import csv
with open(‘xiaoshuaib.csv’, mode=‘w’) as csv_file: fieldnames = [‘你是谁’, ‘你几岁’, ‘你多高’] writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader() writer.writerow({‘你是谁’: ‘小帅b’, ‘你几岁’: ‘18岁’, ‘你多高’: ‘18cm’}) writer.writerow({‘你是谁’: ‘小帅c’, ‘你几岁’: ‘19岁’, ‘你多高’: ‘17cm’})

python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。


昨天小帅b看到一些事情不顺眼


有人偷换概念


忍不住就写了一篇反讽 996 的


看不下去了,我支持996,年轻人就该996!


没想到有些人看不懂


这就算了


还来骂我


早些时候关注我的小伙伴应该知道我第一时间就发过反对 996 的文章


去他妈的996!

python之父就是牛逼


哎~


不过也好


洗掉一些无脑粉丝


“你个假粉丝,小帅b不是蔡徐坤”



好了


进入正题


上次


小帅b跟你说了如何安装 Appium 的相关环境


以及让它自动打开了手机上的微信App


python爬虫23 | 手机,这次要让你上来自己动了。这就是 Appium+Python 的牛x之处


相信你已经跃跃欲试


想要来爬取一些手机上的 APP 数据了


那么这次


小帅b就带你爬取微信朋友圈的数据


接下来就是


学习 python 的正确姿势



友情提醒

本篇需要你先安装好 Appium 相关环境才可以哟,如果你还没安装的话快点出门左转,安装完之后再来这里玩耍。


ok


首先我们要知道微信这个 apk 的包名和启动页的 Activity


将你的 Android 鸡连接到电脑


在终端输入 adb devices 确保你已经将你的鸡连接到电脑



如果像上面这样出现设备名称就说明你连接上你的电脑了


如果你插进电脑之后还没发现有任何设备名称显示


那就记得打开 USB 调试,多拔插几次,总会连上的,这是过来人经验


接着


在你的手机里面打开微信


然后打开你的终端输入


adb shell


然后输入


dumpsys activity | grep mFocusedActivity




这时候我们就获取到微信的包名和启动页面的名称了


我们还要知道我们的手机是什么版本的


输入以下命令获取


adb shell getprop ro.build.version.release


那么现在我们就知道了这些必要的信息了


   desired_caps = {}   desired_caps[‘platformName’] = ‘Android’   desired_caps[‘platformVersion’] = ‘5.1’   desired_caps[‘deviceName’] = ‘88CKBM622PAM’   desired_caps[‘appPackage’] = ‘com.tencent.mm’   desired_caps[‘appActivity’] = ‘.ui.LauncherUI’



接下来


主要思路就是


自动开启微信

模拟登录微信

找到小帅b的朋友圈

把朋友圈的数据抓下来


想要模拟登录


我们就需要获取到微信的登录按钮这个元素


如何获取呢?


在你安装好的 sdkmanager 的 tool 目录下


有一个叫做 uiautomatorviewer 的工具


windows用户直接双击打开


ubuntu的话可以进入相应的目录

用命令 ./uiautomatorviewer 行打开


~/android/tools/bin$ ./uiautomatorviewer 


打开之后是这个鸟样



我们点击菜单栏的第二个图标按钮



这时候你就会发现


手机的屏幕被抓过来了


用鼠标点一下登录按钮你会看到


相应的资源信息都被定位到了



那么要让它自动点击登录按钮就简单了


# 获取到登录按钮后点击 login_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/e4g”))) login_btn.click()


点击登录之后页面是这样的



我们要切换到用邮箱登录


还是老样子


我们获取到按钮,然后让它点击


 # 获取使用微信号登录按钮  change_login_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/cou”)))  change_login_btn.click()


那么接下来就输入账号密码了





获取到账号和密码的 EditText 和 登录按钮


然后自动输入账号密码


最后点一下登录


 # 获取输入账号元素并输入 account = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//[@resource-id=”com.tencent.mm:id/cos”]/android.widget.EditText’))) account.send_keys(“你的微信账号”) # 获取密码元素并输入 password = self.wait.until(EC.presence_of_element_located((By.XPATH,  ‘//[@resource-id=”com.tencent.mm:id/cot”]/android.widget.EditText’))) password.send_keys(“你的微信密码”) # 登录 login = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/cov”))) login.click()


登录之后会弹出一个界面


你愿意把你的通讯录授权给我吗?


呵呵


no!



# 点击去掉通讯录提示框no_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/az9”)))no_btn.click()


这样


我们就成功登入微信了


接下来找到小帅b的微信



需要点击上方的搜索按钮


 # 获取到搜索按钮后点击 search_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/iq”))) search_btn.click()


这时候会出现输入框



搜索小帅b本b


# 获取搜索框并输入search_input = self.wait.until(EC.presence_of_element_located((By.ID, “com.tencent.mm:id/kh”)))search_input.send_keys(“wistbean”)


这时候会出现一个 item



没错


点击头像进去


# 点击头像进入 xiaoshuaib_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/py”))) xiaoshuaib_btn.click()


接下来几步都是一个道理


主要是进入小帅b的朋友圈


# 点击右上角…进入menu_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/jy”)))menu_btn.click()# 再点击头像icon_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/e0c”)))icon_btn.click()# 点击朋友圈moment_btn = self.wait.until(EC.element_to_be_clickable((By.ID, “com.tencent.mm:id/d86”)))moment_btn.click()


就这样点进去



进入朋友圈之后


我们来分析一下




可以看到小帅b的朋友圈是这样的


我们需要滑动获取到更多内容


可以使用 Appium 的 swipe 方法


再来


我们需要循环获取到数据



可以看到每条朋友圈都被封装到 ListView 这个容器里面


所以我们要从这里面获取所有数据


然后再进行遍历


那么每一个具体的条目呢?



可以看到


数据被放在了 LinearLayout 的具体容器里面了


所以我们可以根据 id 获取相应的内容


 # 获取 FrameLayout items = self.wait.until(EC.presence_of_all_elements_located((By.ID, ‘com.tencent.mm:id/eew’))) # 滑动 self.driver.swipe(self.start_x, self.start_y, self.end_x, self.end_y, 2000) #遍历获取 for item in items:     moment_text = item.find_element_by_id(‘com.tencent.mm:id/kt’).text     day_text = item.find_element_by_id(‘com.tencent.mm:id/eke’).text     month_text = item.find_element_by_id(‘com.tencent.mm:id/ekf’).text     print(‘抓取到小帅b朋友圈数据: %s’ % moment_text)     print(‘抓取到小帅b发布时间: %s月%s’ % (month_text, day_text))



至此


我们的代码写完了


来运行一下吧


首先打开 Appium


[Appium] Welcome to Appium v1.12.1[Appium] Appium REST http interface listener started on 0.0.0.0:4723


接着运行爬取朋友圈的代码


截取部分结果


微信启动…登录成功…搜索小帅b…进入朋友圈…抓取到小帅b朋友圈数据: 那天马云说:我从来没碰过钱,我对钱没兴趣。
最近马云说:能 996 是一种福气,我每天都 1212。
果然,有钱爸爸说话就是好听。抓取到小帅b发布时间: 4月月12抓取到小帅b朋友圈数据: 有本事双击我头像抓取到小帅b发布时间: 4月月10抓取到小帅b朋友圈数据: 刚点了外卖,小哥有点超时才送到。我倒不觉得有什么,可是小哥将餐物双手递给我后接下来的动作让我惊讶到了:
他对我深深地鞠了一躬……😳抓取到小帅b发布时间: 4月月01抓取到小帅b朋友圈数据: 有人抱怨现在的互联网产品太霸道,微信不能打开淘宝链接,头条不能放微信二维码,百度搜不到知乎高质量问题……
但其实出门看一下,好像也没有哪家麦当劳可以直接开在肯德基里面卖全家桶的。抓取到小帅b发布时间: 3月月29抓取到小帅b朋友圈数据: 有人抱怨现在的互联网产品太霸道,微信不能打开淘宝链接,头条不能放微信二维码,百度搜不到知乎高质量问题……
但其实出门看一下,好像也没有哪家麦当劳可以直接开在肯德基里面卖全家桶的。抓取到小帅b发布时间: 3月月28抓取到小帅b朋友圈数据: 这两天听到最多的一句话就是:帅b老仙,法力无边。
整的我差点以为自己有法力了……抓取到小帅b发布时间: 3月月25抓取到小帅b朋友圈数据: 夸夸群,写几个微信机器人放群里,搞点夸奖人的语句数据库,根据用户的话检索一下,然后返回相应的夸奖语句。
嗯,然后把我自己放进群里,享受一顿夸,觉得不爽还可以继续改那些夸我的话。抓取到小帅b发布时间: 3月月22抓取到小帅b朋友圈数据: 突然发现我好久好久没有讲潮汕话了…抓取到小帅b发布时间: 3月月20抓取到小帅b朋友圈数据: 夸夸群,写几个微信机器人放群里,搞点夸奖人的语句数据库,根据用户的话检索一下,然后返回相应的夸奖语句。
嗯,然后把我自己放进群里,享受一顿夸,觉得不爽还可以继续改那些夸我的话。抓取到小帅b发布时间: 3月月15抓取到小帅b朋友圈数据: 根据监管部门规定以及相关投诉
这条朋友圈无法观看,但你可以点赞抓取到小帅b发布时间: 3月月10抓取到小帅b朋友圈数据: 之前想的是再好的产品也抵不过有强大 IP 支撑的破产品。
但现在想想,IP 也是产品的一部分。抓取到小帅b发布时间: 3月月05抓取到小帅b朋友圈数据: 之前想的是再好的产品也抵不过有强大 IP 支撑的破产品。
但现在想想,IP 也是产品的一部分。抓取到小帅b发布时间: 3月月04抓取到小帅b朋友圈数据: 9102了,还是有那么多 zf 的网站又丑又难用。抓取到小帅b发布时间: 3月月01



ok


拿到数据还可以进一步存储


小帅b就不说了


因为从下一篇开始


小帅b会说说爬取下来的数据存储相关的


这一篇


主要让你知道如何爬取 app 的数据


如果你想去抓包爬取朋友圈的数据


是很难的


微信做了限制


所以用 Appium 相对来说就简单好多啦


本篇涉及到的源代码一样放在了公众号


在后台发送 「朋友圈」获取


下次见


peace


帅b老仙

法力无边




相关文章

1、对于b站这样的滑动验证码,不好意思,照样自动识别

2、手机,这次要让你上来自己动了。这就是 Appium+Python 的牛x之处

3、上来,自己动 !这就是 selenium 的牛逼之处




右下角

发功+1


python爬虫23 | 手机,这次要让你上来自己动了。这就是 Appium+Python 的牛x之处



你有没有想过让你的手机帮你自动完成某些事情


比如自动帮你抢红包


有些软件不是有签到活动么


这些傻瓜式的操作


能不能让手机自动签到呢?


自动帮你叫外卖

自动帮你打电话

等等



还有


对于手机上的一些比较难以通过抓包获取的数据


想不想像 selenium 那样轻松获取?


之前小帅b就给大家介绍了 selenium


python爬虫09 | 上来,自己动 !这就是 selenium 的牛逼之处


可以模拟人类自动操作浏览器上的网页


我们还使用它爬取了


“鸡你太美”


python爬虫11 | 这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们


相信你已经体验到 selenium 的魅力了


对于一些复杂的 PC 端的网页爬取


它就是个利器


不过


对于手机上的一些稍微复杂点的 APP 数据


selenium 就显得有点无能为力了



那么


有没有像 selenium 这样的框架

可以模拟人类自动操作手机上的 APP 呢


答案是肯定的


那就是


Appium


如何让它来自动操作我们的手机呢


那么


接下来就是


学习 python 的正确姿势




为什么说 Appium 牛逼呢


说 4 点足以


1、他是开源的手机端自动测试框架


2、selenium可以做的 Appium 都可以做,selenium不可以做的Appium 依然可以做,它能够支持 Android、iOS、windows 系统的原生 APP 进行自动操作


3、它可以支持不同的语言写脚本,比如我们的 Python,还有Java、JavaScript 等


4、以前你想要爬取 App 的数据的时,对于较难抓取的数据,你还需要对 App 进行反编译,很麻烦,但是 Appium 就不需要这么麻烦



那 Appium 是怎么玩的呢


你可以把 Appium 当做是一个服务器


我们将我们写的控制操作 APP 的 python 代码


扔给 Appium


Appium 得到了请求,看到你跟它说要怎么去操作 APP


它就乖乖的听你话去操作 APP 了



我们在使用 Appium 之前


我们需要安装相关的环境才可以使用


由于 Android 开源又好用,又有虚拟机可以玩


所以我们要的就是自动操作 Android 手机


具体来说


我们需要安装以下环境


真香警告


Appium 虽然比 selenium 对环境的要求相对复杂一丢,但是相信我,搞定之后你绝对会体验到 Appium 的魅力,接下来要说的内容相对干货,你需要拿出点时间,然后跟着 小帅b 一步一步装起来,如果你之前没接触相关的环境安装,可能在安装过程中你会说几次脏话,没关系,”挖槽”,”TMD” 完之后,都给我安装好以下内容。





1、node.js 和 npm

Appium需要


2、JDK

java 环境,Android需要这个环境


3、Android SDK

Android强大的开发工具包


4、Android虚拟机

可选,如果你用你的真鸡也可以的,用 usb 插入电脑就行


5、Appium

我们的主角


6、Appium-Python-Client

python客户端,用来连接 Appium


7、Python

python相信你早已经安装了,还没有安装的是猪吧?



那么接下来


小帅b教你一步一步地安装起来


不同的操作系统安装方式可能有些许不同


但都差不多也就那会事


1、安装node和npm


你可以到以下链接去下载 node 安装包

https://nodejs.org/zh-cn/download/


然后一顿安装


windows安装的时候记得勾选 Add to path (添加到环境变量)


如果你和小帅b一样用 ubuntu 这种类 Unix 系统的话输个命令就行


sudo apt-get updatesudo apt-get install nodejs


然后你输入命令 node -v

如果显示版本号就说明你成功安装 node 了


xiaoshuaib@xiaoshuaib:~$ node -vv10.15.3


安装 node 过程中同时也安装了 npm 了


输入 npm -v 有显示版本好的话说明你安装好了 npm


xiaoshuaib@xiaoshuaib:~$ npm -v6.4.1



2、安装JDK


你可以到以下链接去下载 jdk


https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


根据你的系统自行选择相应的 jdk



安装完成之后记得配置好 Java 环境变量


如何配置 jdk 环境变量就不在这里说了


因为不同的系统配置方式不同


你可以自行 Google



在你的终端输入 javac ,如果你得到如下的东西说明你成功安装好 jdk 和 配置好环境了


xiaoshuaib@xiaoshuaib:~$ javacUsage: javac <options> <source files>where possible options include:  -g                         Generate all debugging info  -g:none                    Generate no debugging info  -g:{lines,vars,source}     Generate only some debugging info  -nowarn                    Generate no warnings  -verbose                   Output messages about what the compiler is doing  -deprecation               Output source locations where deprecated APIs are used  -classpath <path>          Specify where to find user class files and annotation processors  -cp <path>                 Specify where to find user class files and annotation processors  -sourcepath <path>         Specify where to find input source files  -bootclasspath <path>      Override location of bootstrap class files  -extdirs <dirs>            Override location of installed extensions  -endorseddirs <dirs>       Override location of endorsed standards path  -proc:{none,only}          Control whether annotation processing and/or compilation is done.



3、安装Android SDK


有些小伙伴可能之前没开发过 Android


不过没关系


Android SDK 是 Android 开发的工具包


下载方式和 JDK 类似


可以到以下链接去下载 sdk


https://developer.android.com/studio#downloads



如果你打不开这个链接的话


可以用镜像链接


http://www.android-studio.org/index.php/download/hisversion


下载完之后就一顿解压


解压完之后打开 sdkmanager


windows的话有界面


直接选择一个 Android 版本


然后你点击 install package 就可以了


或者你也可以像 Linux 一样


解压完之后


进入目录中的 /tools/bin


输入以下命令安装最新的工具


xiaoshuaib@xiaoshuaib:~/android/tools/bin$ ./sdkmanager “platform-tools” “platforms;android-28”


接着配置一下环境变量


ubuntu 的话可以这样配


打开 profile


 sudo vim /etc/profile


添加你安装的sdk的目录


export ANDROID_HOME=/home/xiaoshuaib/androidexport PATH=$PATH:${ANDROID_HOME}/toolsexport PATH=$PATH:${ANDROID_HOME}/platform-tools


然后设置生效后重启一下


source /etc/profile



windows配置环境变量的话


也是这个道理


在你的电脑–属性–高级–环境变量


新建一个变量 ANDROID_HOME


值就是你刚刚解压下来的 Android 目录


然后在你的 path 中添加


${ANDROID_HOME}/tools;${ANDROID_HOME}/platform-tools


接着


在命令行输入 adb shell


如果你出现和小帅b以下这样的就说明你配置对了


xiaoshuaib@xiaoshuaib:~$ adb shell daemon not running; starting now at tcp:5037 daemon started successfully


4、安装 android 虚拟机


其实你有真鸡的话不用安装也可以


安装虚拟机你可以到以下链接下载


https://www.genymotion.com/download


想当年小帅b在玩 Android 开发的时候就经常用 genymotion


速度相对来说快了不少



打开虚拟鸡或者用你的真鸡连接电脑(记得打开usb调试)


然后输入 adb devices


如果你像小帅b一样列出你现在的 Android 手机


xiaoshuaib@xiaoshuaib:~$ adb devicesList of devices attached88CKBM622PAM  device


那么就说明是正确的啦



5、安装 Appium


第一种安装方式


使用命令行用 npm 安装 Appium


npm install -g appium


ubuntu需要权限的话可以使用如下命令


sudo npm install -g appium –unsafe-perm=true –allow-root


第二种安装方式


你也可以到以下链接直接下载安装包


https://github.com/appium/appium-desktop/releases



安装完之后输入命令 appium

如果你和小帅b这样的就说明成功安装 Appium了


xiaoshuaib@xiaoshuaib:~$ appium[Appium] Welcome to Appium v1.12.1[Appium] Appium REST http interface listener started on 0.0.0.0:4723


6、Appium-Python-Client


pip install Appium-Python-Client


OK


那么到现在我们就把该装的装完了


酸爽~



我们可以来安装以下 appium-doctor 来检测一下我们安装的环境是否都可以了


npm install -g appium-doctor


安装完之后输入 appium-doctor


如果你也出现这样的



congratulation


你已经搞定所需环境啦



事不宜迟


赶紧整个小例子试试水先


我们就让它自动打开手机的微信 APP


确保手机连接到电脑


xiaoshuaib@xiaoshuaib:~$ adb devicesList of devices attached88CKBM622PAM  device


开启 Appium


xiaoshuaib@xiaoshuaib:~$ appium[Appium] Welcome to Appium v1.12.1[Appium] Appium REST http interface listener started on 0.0.0.0:4723


写个python


# coding=utf-8
from appium import webdriver
desired_caps = { ‘platformName’: ‘Android’, ‘deviceName’: ‘88CKBM622PAM’, ‘platformVersion’: ‘5.1’, ‘appPackage’: ‘com.tencent.mm’, ‘appActivity’: ‘com.tencent.mm.ui.LauncherUI’ }
driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub', desired_caps)


运行python之后


Appium 开始执行



看看你的手机



自动打开了!


cool~


ok


本篇主要让你知道怎么安装这些所需要的环境


可能你现在有点疑问


怎么知道微信的包名的

怎么知道微信的启动页面的

python代码如何写自动操作的


别急


你先把环境安装好


下一篇


小帅b将带你使用 Appium 来爬取 APP 上的数据


期待就好了


帅b老仙

法力无边






右下角点一下

给小帅b发点功


python爬虫22 | 以后我再讲「模拟登录」我就是狗


接下来就是


学习python的正确姿势


做爬虫


绕不开模拟登录


为此小帅b给大家支了几招


python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!



有些网站的登录很弱鸡


传个用户名和密码


来个 POST 请求就搞定了


但还是少数


大多网站还是需要验证码的


登录需要验证码


频繁请求需要验证码


为此小帅b教你如何自动识别


python爬虫20 | 小帅b教你如何识别图片验证码


python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别



当然了


市面上还有许多打码验证平台


花点钱买个接口


直接调用就行


小帅b不建议你去购买这些玩意


自己能学着搞定为啥要花钱


除非真的是识别率低到叫爸爸


当然如果是公司项目就另当别论了



总该站在不同的角度去思考


该花公司钱的地方还是得花的嘛



为啥我说


以后我再讲「模拟登录」我就是狗


因为我觉得前面讲的几篇已经够用了


万变不离其宗


有些套路是可以在不同地方使用的


效果都差不多



不过小帅b还想给你加个餐


小帅b经常会去瞎逛 Github


一不小心就发现了一个不错的开源项目


awesome-python-login-model


这个项目使用 python 模拟登录了各大型网站


确实有点 awesome



不过实现原理和小帅b之前讲的都差不多


登录完拿到 cookie


然后做你想做的事情


这个项目现在实现了这些网站的模拟登录




发现好东西当然要第一时间跟各位分享一下


不用谢


小帅b就是除了帅还这么好


地址在这


https://github.com/CriseLYJ/awesome-python-login-model


那么


有了小帅b前面的几篇文章


再结合这个


我想模拟登录对你来说


应该不在话下了


(有没发现这次字体小了点)


好了


咱们下次见


peace



帅b老仙

法力无边



右下角

沾点法力


python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别


今天


要来说说滑动验证码了


大家应该都很熟悉


点击滑块然后移动到图片缺口进行验证



现在越来越多的网站使用这样的验证方式


为的是增加验证码识别的难度



那么


对于这种验证码


应该怎么破呢


接下来就是


学习 python 的正确姿势



打开 b 站的登录页面


https://passport.bilibili.com/login



可以看到登录的时候需要进行滑块验证


按下 F12


进入 Network


看下我们将滑块移到缺口松开之后做了什么提交



可以看到是一个 GET 请求


但是


这请求链接也太特么长了吧


就是比小帅b短了一点点



我们来看看请求的参数是怎么样的



哇靠


gt?


challenge?


w?


这些都是什么鬼参数


还加密了


完全下不了手啊



那么


本篇完


再见


peace











































你是不是迷恋我??



好吧


你居然滑到这里来了


说明你还是有点小帅b的


小帅b是那种遇到一点困难就放弃的人吗


显然不是


那么接下来才是真的


学习 python 的正确姿势



既然以请求的方式不好弄


我们从它们的源代码入手


看看有什么突破口



回到 b 站的登录页


按下 F12


进入 Element


然后点击滑块出现了图片


定位一下



发现有两个 a 标签


一个 class 是 gt_bg gt_show


一个 class 是 gt_fullbg gt_show


和小帅b想的一样


这个验证码应该是有两张图片


一张是完全的背景图片


一张是缺口的图片


那把这两张图片下载下来对比一下不就行了


打开 a 标签一看



哇靠


一张图片被切割成很多小块


原来这张图片是拼出来的


我们看看原始图片是怎么样的



什么乱七八糟的


再仔细看下源代码


原来是在同一张图片通过偏移量合成了一张完整的图片


background-position: -277px -58px;


厉害厉害


小帅b看了一下缺口的图片也是如此




到这里


我们的第一个思路就是


下载这两张原始图片


然后通过偏移量合成两张真正的图片


背景图



↓变身




缺口图



↓变身



那么怎么做呢?


因为我们还要模拟滑动滑块


所以呢


我们要用到 selenium


打开b站的登录页


然后等到那个滑块显示出来


 # 获取滑块按钮    driver.get(url)    slider = WAIT.until(EC.element_to_be_clickable(        (By.CSS_SELECTOR, “#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show”)))


接下来我们就获取页面的源码


driver.page_source


然后使用 bs 获取两张原始背景图片的 url


    bs = BeautifulSoup(driver.page_source,‘lxml’)    # 找到背景图片和缺口图片的div    bg_div = bs.find_all(class_=‘gt_cut_bg_slice’)    fullbg_div = bs.find_all(class_=‘gt_cut_fullbg_slice’)
# 获取缺口背景图片url bg_url = re.findall(‘background-image:\surl(“(.?)”)‘,bg_div[0].get(‘style’)) # 获取背景图片url fullbg_url = re.findall(‘background-image:\surl(“(.?)”)‘,fullbg_div[0].get(‘style’))


拿到了图片地址之后


将图片下载下来


 # 将图片格式存为 jpg 格式    bg_url = bg_url[0].replace(‘webp’, ‘jpg’)    fullbg_url = fullbg_url[0].replace(‘webp’, ‘jpg’)    # print(bg_url)    # print(fullbg_url)
# 下载图片 bg_image = requests.get(bg_url).content fullbg_image = requests.get(fullbg_url).content print(‘完成图片下载’)


ok






我们已经把两张原始图片下载下来了



那么接下来就是要合成图片了


我们要根据图片的位置来合成


也就是源码中的 background-position



获取每一个小图片的位置


我们可以通过字典的形式来表示这些位置


然后将数据放到列表中


    # 存放每个合成缺口背景图片的位置    bg_location_list = []    # 存放每个合成背景图片的位置    fullbg_location_list = []
for bg in bg_div: location = {} location[‘x’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, bg.get(‘style’))[0][0]) location[‘y’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, bg.get(‘style’))[0][1]) bg_location_list.append(location)
for fullbg in fullbg_div: location = {} location[‘x’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, fullbg.get(‘style’))[0][0]) location[‘y’] = int(re.findall(‘background-position:\s(.?)px\s(.?)px;’, fullbg.get(‘style’))[0][1]) fullbg_location_list.append(location)


那么


现在我们已经有了原始图片


还知道了每个位置应该显示原始图片的什么部分


接下来我们就写一个方法


用来合成图片


    # 写入图片    bg_image_file = BytesIO(bg_image)    fullbg_image_file = BytesIO(fullbg_image)
# 合成图片 bg_Image = mergy_Image(bg_image_file, bg_location_list) fullbg_Image = mergy_Image(fullbg_image_file, fullbg_location_list)


那么问题又来了


怎么合成啊


我们再看看一开始分析的图片



这里图片被分割成的每一个小图片的尺寸是


10 58


所以我们也要将我们刚刚下载的原始图片切割成相应的尺寸大小


而且


这张图片是由上半部分的小图片和下半部分的小图片合成的


所以我们定义两个 list 来装这些小图片


  # 存放上下部分的各个小块    upper_half_list = []    down_half_list = []


然后将原始的图片切割好放进去


image = Image.open(image_file)
# 通过 y 的位置来判断是上半部分还是下半部分,然后切割 for location in location_list: if location[‘y’] == -58: # 间距为10,y:58-116 im = image.crop((abs(location[‘x’]), 58, abs(location[‘x’])+10, 116)) upper_half_list.append(im) if location[‘y’] == 0: # 间距为10,y:0-58 im = image.crop((abs(location[‘x’]), 0, abs(location[‘x’]) + 10, 58)) down_half_list.append(im)


至此


我们这两个 list 就分别放好了各个切割的图片了


那么接下来就创建一张空白的图片


然后将小图片一张一张(间距为10)的粘贴到空白图片里


这样我们就可以得到一张合成好的图片了



我真是个天才



 # 创建一张大小一样的图片    new_image = Image.new(‘RGB’, (260, 116))
# 粘贴好上半部分 y坐标是从上到下(0-116) offset = 0 for im in upper_half_list: new_image.paste(im, (offset, 0)) offset += 10
# 粘贴好下半部分 offset = 0 for im in down_half_list: new_image.paste(im, (offset, 58)) offset += 10


那么到现在


我们可以得到网页上显示的那两张图片了


一张完全的图片



一张带缺口的图片



接下来我们就要通过对比这两张图


看看我们要滑动的距离是多远


    # 合成图片    bg_Image = mergy_Image(bg_image_file, bg_location_list)    fullbg_Image = mergy_Image(fullbg_image_file, fullbg_location_list)    # bg_Image.show()    # fullbg_Image.show()
# 计算缺口偏移距离 distance = get_distance(bg_Image, fullbg_Image) print(‘得到距离:%s’ % str(distance))


可以通过图片的 RGB 来计算


我们设定一个阈值


如果 r、g、b 大于这个阈值


我们就返回距离


def get_distance(bg_Image, fullbg_Image):
#阈值 threshold = 200
print(bg_Image.size[0]) print(bg_Image.size[1])

for i in range(60, bg_Image.size[0]): for j in range(bg_Image.size[1]): bg_pix = bg_Image.getpixel((i, j)) fullbg_pix = fullbg_Image.getpixel((i, j)) r = abs(bg_pix[0] - fullbg_pix[0]) g = abs(bg_pix[1] - fullbg_pix[1]) b = abs(bg_pix[2] - fullbg_pix[2])
if r + g + b > threshold: return i


现在


我们知道了关键的滑动距离


激动人心的时刻到了


我们使用 selenium


拿到滑块的元素


然后根据这个距离拖动到缺口位置不就好了么


马上打开 selenium 的文档


看到了这个函数



它可以使用左键点击元素


然后拖动到指定距离


最后释放鼠标左键


挖槽


正合我意


赶紧试一下


knob =  WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, “#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show“)))ActionChains(driver).drag_and_drop_by_offset(knob, distance, 0).perform()


运行一下试试看吧



哇哦你妹哦~


妖怪吃了拼图了



看来直接拖拽是不行的


容易遇到妖怪


毕竟这太快了


就算加藤鹰也没那么快吧


小帅b试着拖完滑块让它睡一下再释放


    ActionChains(driver).click_and_hold(knob).perform()    ActionChains(driver).move_by_offset(xoffset=distance, yoffset=0.1).perform()    time.sleep(0.5)    ActionChains(driver).release(knob).perform()


发现拼图还是特么的被妖怪吃了



后来小帅b发现原来别人也遇到了这样的问题


然后又发现了


有个叫匀速直线运动的东西


什么 加速度


什么 v = v0 + at


什么 s = ½at²



这不是高中的知识点么


瞬间想起小帅b高中的时候在最角落的课桌


此刻往右上方抬起头


45 度角


让我的眼泪划出一条美丽的弧线



什么鬼


回到正题


我们可以使用它来构造一个运动路径


该加速时加速


该减速的时候减速


这样的话就更像人类在滑动滑块了



def get_path(distance): result = [] current = 0 mid = distance 4 / 5 t = 0.2 v = 0 while current < (distance - 10): if current < mid: a = 2 else: a = -3 v0 = v v = v0 + a t s = v0 t + 0.5 a t * t current += s result.append(round(s)) return result


这次


我们使用这个轨迹来滑动


    knob = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, “#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show”)))    result = get_path(distance)    ActionChains(driver).click_and_hold(knob).perform()
for x in result: ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
time.sleep(0.5) ActionChains(driver).release(knob).perform()


好了好了


我们再来运行一下吧



哈哈哈


cool


成功识别了哇


我不管



当然了


成功率不是 100%


可以多调戏它几次


ok


以上就是识别滑动验证码的具体过程了


对于其它大部分的滑动验证码


也是可以使用这招搞定的


由于篇幅有限


源代码我放在了这个公众号后台了


你发送〔滑动〕两个字


就可以获取啦



这次本篇就真的完啦


听说你想约我?


peace



相关文章


(小帅b教你三招搞定模拟登录)


(小帅b教你轻松识别图片验证码)




点个在看啊~~(破音)


python爬虫20 | 小帅b教你如何识别图片验证码



当你在爬取某些网站的时候


对于你的一些频繁请求


对方会阻碍你


常见的方式就是使用验证码


验证码的主要功能


就是区分你是人还是鬼(机器人)



想法设法的搞一些手段来对付技术



技术又能对付人们的想法


一来一去


就有了各种各样的变态验证码


也有了各种各样的应对方式


常见的验证码有这么几种



图像验证

语音验证

短信验证

极验验证

点击验证


今天


小帅b想跟你先说说如何识别图像验证码



那么


接下来就是


学习 python 的正确姿势




我们来看看这些图片验证码


(此图来源网络)


可以发现


这些验证码大多是数字和字母组成


然后在此之上再添加一些像毛一样的线


或者搞一些噪点


或者把这些字符扭曲一下


为了增加识别难度也是辛苦人家了


接下来我们思考一下


我们要识别这类验证码要怎么做呢



首先要处理一下验证码图片


什么噪点乱七八糟的


我们尽量把它们去掉


让图片


尽量黑白


尽量只剩下字符本身


然后再用 python 强大的 OCR 工具


Python-tesseract


来识别我们优化好的图片


这样正确率就会大大的提高



哎呀


我真是个聪明 boy 啊



为了让你更清楚的知道怎么识别图像验证码


小帅b用 python 搞了几张识别难度不同的验证码



第一张



难度系数:



第二张



难度系数:



第三张



难度系数:



第四张



难度系数:



第五张



难度系数 :



先对第一张进行识别


这张看起来没什么 “污染”


所以相对简单


先安装一下 pytesseract

pip install pytesseract


接着安装一下 tesseract-ocr


如果你是 ubuntu 系统可以直接使用如下命令安装


sudo apt install tesseract-ocr


如果你是 win 系统自行 Google 一下安装 tesseract-ocr 以及环境变量配置


完了之后就导入相关模块到我们的代码文件中


try:    from PIL import Imageexcept ImportError:    import Imageimport pytesseract


接着我们就打开第一张图片


使用 pytesseract 识别


打印一下


captcha = Image.open(“captcha1.png”)result = pytesseract.image_to_string(captcha)print(result)


打印结果



ok,么有问题



接着我们来识别第 2 张



captcha = Image.open(“claptcha2.png”)result = pytesseract.image_to_string(captcha)print(result)


结果打印出来是



1924??


这就说明


pytesseract 是没办法识别太多噪点的图片的


如果这个图片再加上一点彩色背景



那么对 pytesseract 来说更是有点吃力的


所以我们先对这张图片灰度处理一下


captcha = Image.open(“captcha2.png”)result = captcha.convert(‘L’)result.show()


图片就变成灰了



虽然灰了


但是还不够


我们除了处理灰度还需要对其 二值化


def convert_img(img,threshold):    img = img.convert(“L”)  # 处理灰度    pixels = img.load()    for x in range(img.width):        for y in range(img.height):            if pixels[x, y] > threshold:                pixels[x, y] = 255            else:                pixels[x, y] = 0    return img


调用一下


convert_img(captcha,150)


这时候图片就变成这样了



是不是一下子就清晰很多了呢


这时候我们对这张图片识别一下


# 识别一下result = pytesseract.image_to_string(result)print(result)


成功识别




接下来我们再来看看有毛有噪的图片



这时候直接去识别是识别不出来的


所以还是老办法


先处理灰度


再 二值化


这次我们再降一下噪


data = img.getdata()    w,h = img.size    count = 0    for x in range(1,h-1):        for y in range(1, h - 1):            # 找出各个像素方向            mid_pixel = data[w  y + x]            if mid_pixel == 0:                top_pixel = data[w  (y - 1) + x]                left_pixel = data[w  y + (x - 1)]                down_pixel = data[w  (y + 1) + x]                right_pixel = data[w * y + (x + 1)]
if top_pixel == 0: count += 1 if left_pixel == 0: count += 1 if down_pixel == 0: count += 1 if right_pixel == 0: count += 1 if count > 4: img.putpixel((x, y), 0)


图片变成这样了



再识别一下






不过


pytesseract 不是万能的


对于稍微复杂一点的就识别不出来了


至于这张



你能看出它是 1l1l0oO0 么?


如果你能


算你牛逼



反正小帅b不能


所以 pytesseract 也不能


对于一些简单的验证码


使用 pytesseract 还是可以的


如果你想提高 pytesseract 识别率


还可以去搞些图片去训练一下 tesseract-ocr



ok


以上


主要让你了解一下图片识别库的使用


以及对一些图片的常用降噪操作


那么下次你爬到一些需要图像的简单验证码


应该不在话下了



下回见


听说你要 我啊!?


peace




点个在看啊~~(破音)



python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!



你好


由于你是游客


无法查看本文


请你登录再进


谢谢合作



当你在爬某些网站的时候


需要你登录才可以获取数据


咋整?


莫慌


小帅b把这几招传授给你


让你以后从容应对



那么


接下来就是


学习 python 的正确姿势



登录的常见方法无非是这两种


1、让你输入帐号和密码登录



2、让你输入帐号密码+验证码登录



今天


小帅b先跟你说说第一种


需要验证码的咱们下一篇再讲


第一招



Cookie大法


你平常在上某个不为人知的网站的时候


是不是发现你只要登录一次


就可以一直看到你想要的内容


过了一阵子才需要再次登录


这就是因为 Cookie 在做怪


简单来说


就是每一个使用这个网站的人


服务器都会给他一个 Cookie


那么下次你再请求数据的时候


你顺带把这个 Cookie 传过去


服务器一看


诶,小伙子是老客户啊



有登录过


直接返回数据给他吧


在服务中还可以设置 Cookie 的有效时间


也就是说


当你下次携带一个过期了的 Cookie 给服务器的时候


服务器虽然知道你是老客户


但是还是需要你重新再登录一次


然后再给你一个有效的 Cookie


Cookie 的时长周期是服务器那边定的


ok


了解了这一点之后


我们就来玩一下吧


我们以「逼乎」为例


https://biihu.cc/account/login/


输入地址之后


按一下 F12


点击 network 标签


然后登录你的帐号


然后点击其中一个


你就可以看到在 Request Headers 有你的 Cookie




有了 Cookie 之后


我们在代码中直接获取我的个人信息


import requests
headers = { # 假装自己是浏览器 ‘User-Agent’: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.75 Chrome/73.0.3683.75 Safari/537.36’, # 把你刚刚拿到的Cookie塞进来 ‘Cookie’: ‘eda38d470a662ef3606390ac3b84b86f9; Hm_lvt_f1d3b035c559e31c390733e79e080736=1553503899; biihu__user_login=omvZVatKKSlcXbJGmXXew9BmqediJ4lzNoYGzLQjTR%2Fjw1wOz3o4lIacanmcNncX1PsRne5tXpE9r1sqrkdhAYQrugGVfaBICYp8BAQ7yBKnMpAwicq7pZgQ2pg38ZzFyEZVUvOvFHYj3cChZFEWqQ%3D%3D; Hm_lpvt_f1d3b035c559e31c390733e79e080736=1553505597’,}
session = requests.Session()response = session.get(https://biihu.cc/people/wistbean%E7%9C%9F%E7%89%B9%E4%B9%88%E5%B8%85', headers=headers)
print(response.text)


运行后可以发现不用登录就可以直接拿到自己的个人信息了


<!DOCTYPE html><html><head><meta content=“text/html;charset=utf-8” http-equiv=“Content-Type” /><meta content=“width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no” name=“viewport” /><meta http-equiv=“X-UA-Compatible” content=“IE=edge,Chrome=1” /><meta name=“renderer” content=“webkit” /><title>小帅b真特么帅 的个人主页 - 逼乎</title><meta name=“keywords” content=“逼乎,问答,装逼,逼乎网站” /><meta name=“description” content=“逼乎 ,与世界分享你的装逼技巧与见解”  /><base href=https://biihu.cc/" /><!–[if IE]></base><![endif]–><link rel=“stylesheet” type=“text/css” href=https://biihu.cc/static/css/bootstrap.css" /><link rel=“stylesheet” type=“text/css” href=https://biihu.cc/static/css/icon.css" /><link href=https://biihu.cc/static/css/default/common.css?v=20180831" rel=“stylesheet” type=“text/css” /><link href=https://biihu.cc/static/css/default/link.css?v=20180831" rel=“stylesheet” type=“text/css” /><link href=https://biihu.cc/static/js/plug_module/style.css?v=20180831" rel=“stylesheet” type=“text/css” /><link href=https://biihu.cc/static/css/default/user.css?v=20180831" rel=“stylesheet” type=“text/css” /><link href=https://biihu.cc/static/css/mood/mood.css" rel=“stylesheet” type=“text/css” /><script type=“text/javascript”>  var _02AEC94D5CA08B39FC0E1F7CC220F9B4=“a5359326797de302bfc9aa6302c001b8”;  var G_POST_HASH=_02AEC94D5CA08B39FC0E1F7CC220F9B4;  var G_INDEX_SCRIPT = “”;  var G_SITE_NAME = “逼乎”;  var G_BASE_URL = https://biihu.cc";  var G_STATIC_URL = https://biihu.cc/static";  var G_UPLOAD_URL = “/uploads”;  var G_USER_ID = “188”;  var G_USER_NAME = “小帅b真特么帅”;  var G_UPLOAD_ENABLE = “Y”;  var G_UNREAD_NOTIFICATION = 0;  var G_NOTIFICATION_INTERVAL = 100000;  var G_CAN_CREATE_TOPIC = “1”;  var G_ADVANCED_EDITOR_ENABLE = “Y”;  var FILE_TYPES = “jpg,jpeg,png,gif,zip,doc,docx,rar,pdf,psd”;</script><script src=https://biihu.cc/static/js/jquery.2.js?v=20180831" type=“text/javascript”></script>
….



第二招



表单请求大法


很简单


就是通过抓包


获取请求登录的时候需要用到的用户名密码参数


然后以表单的形式请求服务器


如果你细心一点的话应该会知道之前说过拉


具体在这

去看下

我就不多说了


python爬虫03:那个叫做 Urllib 的库让我们的 python 假装是浏览器



第三招



Selenium 自动登录法


你应该看过这两个


python爬虫09 | 上来,自己动 !这就是 selenium 的牛逼之处

python爬虫11 | 这次,将带你爬取b站上的NBA形象大使蔡徐坤和他的球友们


看过的话


那么对于你来说


Selenium 自动登录也太 tm 简单了吧


获取到两个输入框的元素


再获取到登录按钮


往输入框写你的帐号密码


然后自动点击一下登录


username = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, “帐号的selector”)))password = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, “密码的selector”)))submit = WAIT.until(EC.element_to_be_clickable((By.XPATH, ‘按钮的xpath’)))
username.send_keys(‘你的帐号’)password.send_keys(‘你的密码’)submit.click()


登录完之后拿到 Cookie


cookies = webdriver.get_cookies()


有了 Cookie 你就可以拿到你想要的数据了


ok


以上这三招



希望对你有帮助


咱们下一篇说说验证码相关


下回见


peace



帅b老仙

法力无边


(你想我么?)



点个在看

继续发力


python爬虫18 | 就算你被封了也能继续爬,使用IP代理池伪装你的IP地址,让IP飘一会



我们上次说了伪装头部



python爬虫17 | 听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部


让自己的 python 爬虫假装是浏览器


小帅b主要是想让你知道


在爬取网站的时候


要多的站在对方的角度想问题



其实


这和泡妞差不多


你要多站在妹纸的角度思考


她的兴趣是什么


她喜欢什么


而不是自己感动自己


单方面的疯狂索取



哦..


扯远了


我们回到反爬虫


这次教你怎么伪装自己的 ip 地址


别让对方轻易的就把你给封掉


如何伪装呢


那么


接下来就是


学习 python 的正确姿势




其实


对于 python 来说


使用代理访问很简单


就拿我们经常使用的 requests 库来说


使用代理 ip 如下


定义代理IP


proxie = {         ‘http’ : http://xx.xxx.xxx.xxx:xxxx',        ‘http’ : http://xxx.xx.xx.xxx:xxx',        ….    }  


使用代理


response = requests.get(url,proxies=proxies)


这样就可以使用你定义的代理地址去访问网站了


我知道你要问了


代理地址哪里来



在网上有很多免费的代理


随便搜就有一堆了


不过你知道的


免费的话很多人都去使用


所以这些代理IP很不稳定


如果你有钱的话


市面上有人就专门提供代理IP的


直接去买就行了



不想花钱呢?


可以搞一个IP代理池


主要就是通过 python 程序去抓取网上大量免费的代理 ip


然后定时的去检测这些 ip 可不可以用


那么下次你要使用代理 ip 的时候


你只需要去自己的 ip 代理池里面拿就行了




道理都懂

但是不想自己弄一个代理池

有没有现成的?


不瞒你说

小帅b发现了一个不错的开源 ip 代理池


https://github.com/Python3WebSpider/ProxyPool.git


如何使用呢


首先使用 git clone 将源代码拉到你本地


git clone https://github.com/Python3WebSpider/ProxyPool.git


接着打开项目中的 setting.py


在这里可以配置相关信息


比如 Redis 的地址密码相关


(如果你之前没有使用过 redis 的话,可以到如下地址下载 https://github.com/MicrosoftArchive/redis/releases




接着在你 clone 下来的文件目录中


安装相关所需的 python 模块


pip3 install -r requirements.txt


接下来开启你的 redis



redis 的默认端口就是 6379


接着就可以运行 run.py 了


代理池开始运行 * Running on http://0.0.0.0:5555/ (Press CTRL+C to quit)开始抓取代理获取器开始执行Crawling http://www.66ip.cn/1.html正在抓取 http://www.66ip.cn/1.html抓取成功 http://www.66ip.cn/1.html 200成功获取到代理 201.69.7.108:9000成功获取到代理 111.67.97.58:36251成功获取到代理 187.32.159.61:51936成功获取到代理 60.13.42.154:9999成功获取到代理 106.14.5.129:80成功获取到代理 222.92.112.66:8080成功获取到代理 125.26.99.84:60493


如果你在运行的时候出现这个错误


AttributeError: ‘int’ object has no attribute ‘items’


更新一下 redis 版本


pip3 install redis==2.10.6 


运行 run.py


这时候在你的 redis 中就有爬取到的代理 ip 了



项目跑起来之后


你就可以访问你的代理池了


比如随机获取一个代理 ip 地址


http://localhost:5555/random


这样访问之后就会获取到一个代理 ip


在代码中获取代理也不在话下啦


import requests
PROXY_POOL_URL = http://localhost:5555/random'
def get_proxy(): try: response = requests.get(PROXY_POOL_URL) if response.status_code == 200: return response.text except ConnectionError: return None




这样


我们就成功的在我们的代理池中获取代理 ip 了


那么下次谁还敢封你ip


你就拿出你的代理ip


继续爬呗



peace


帅b老仙

法力无边





python爬虫17 | 听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部


这两天


有小伙伴问小帅b


为什么我爬取 xx 网站的时候


不返回给我数据


而且还甩一句话给我


“系统检测到您频繁访问,请稍后再来”




小帅b看了一下他的代码


for i in range(1,10000):

requests.get(url)


瞬间震惊了


这就感觉


被连续 fxxk 了 1w 次


你说对方受得了?




不封你 IP 封谁?


要会伪装


要想想看


人是怎么访问网站的


这次我们来说说伪装 Header



那么


接下来就是


学习python的正确姿势



当你要去爬取某个网站的数据的时候


你要想想看


如果是别人爬取你的数据


你会做什么操作


你是不是也不想


让别人随随便便就疯狂请求你的服务器


你是不是也会


采取一定的措施



比如


小帅b有一个网站


你分析到了小帅b的地址


当你想要通过 python 来爬取的时候…



小帅b来写一个简单的可以被请求的例子


from flask import Flask
app = Flask(name)

@app.route(‘/getInfo’)def hello_world(): return “这里假装有很多数据”

if name == main: app.run(debug=True)


ok


假设你现在分析到了小帅b的地址了


也就是可以通过 /getInfo 就可以获取到小帅b网站上的数据了


你感觉很爽


就开始请求了


 url = ‘http://127.0.0.1:5000/getInfo’    response = requests.get(url)    print(response.text)


没错


这个时候你确实获取到数据了



小帅b觉得有点不对劲了


想看看请求的 header 信息



@app.route(‘/getInfo’)def hello_world(): print(request.headers) return “这里假装有很多数据”

if name == main: app.run(debug=True)


结果看到的 headers 信息是这样的


Host: 127.0.0.1:5000User-Agent: python-requests/2.21.0Accept-Encoding: gzip, deflateAccept: /Connection: keep-alive


哇靠


User-Agent: python-requests/2.21.0


居然使用 python 的库来请求


你说小帅b不封你封谁呢?



所以小帅b这个时候进行判断


你就获取不到数据了


@app.route(‘/getInfo’)def hello_world():    if(str(request.headers.get(‘User-Agent’)).startswith(‘python’)):        return “小子,使用爬虫是吧?滚你的”    else:        return “这里假装有很多数据”

if name == main: app.run(debug=True)


你这个时候的请求


if name == main:    url = http://127.0.0.1:5000/getInfo'    response = requests.get(url)    print(response.text)


得到的结果就是


小子,使用爬虫是吧?滚你的


你已经在小帅b面前暴露了


那么怎么办呢?


伪装自己呗


python 不可以访问


浏览器可以访问呀


所以你可以修改你的请求头


还记得 Fiddler(可点击) 吗?


你可以先在浏览器访问


然后在抓取数据的时候获取到 Header 数据




当然你也可以使用 Chrome (可点击) 的控制面板获取 Header



有了 Header 信息之后


就可以使用 requests(可点击) 模块轻松获取


恩,现在的你学会假装自己是浏览器了


if name == main:
headers = { ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36’ }
url = http://127.0.0.1:5000/getInfo' response = requests.get(url,headers=headers) print(response.text)


再获取一次可以发现


返回的是


这里假装有很多数据


ok,你又获取到数据了



当然


仅仅是伪装自己是浏览器还不够的


要多站在对方的角度想问题


往后


小帅b还会继续跟你扯


怎么应对反爬虫的种种策略



peace


帅b老仙

法力无边



与本文相关的文章


1.教你在 Chrome 浏览器轻松抓包

2.教你通过 Fiddler 进行手机抓包

3.Requests库把urllib库拍在沙滩上

4.真的求求你们了,不要再来爬取了



Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×