12

爬虫遇到反爬机制怎么办? 看看我是如何解决的!

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzI1MTE2ODg4MA%3D%3D&%3Bmid=2650076887&%3Bidx=1&%3Bsn=18cce8254ab1f5cf0b595c93db77039e
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

nUBJBj3.jpg!mobile

01

前言

想着爬取 『豆瓣』 的用户和电影数据进行 『挖掘』 ,分析用户和电影之间以及各自之间的关系,数据量起码是 万级别 的。

但是在爬取过程中遇到了反爬机制,因此这里给大家分享一下如何解决爬虫的 反爬问题 ?(以豆瓣网站为例)

qaeaEjI.png!mobile

02

问题分析

起初代码

headers = {
'Host':'movie.douban.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'cookie':'bid=uVCOdCZRTrM; douban-fav-remind=1; __utmz=30149280.1603808051.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __gads=ID=7ca757265e2366c5-22ded2176ac40059:T=1603808052:RT=1603808052:S=ALNI_MYZsGZJ8XXb1oU4zxzpMzGdK61LFA; _pk_ses.100001.4cf6=*; __utma=30149280.1867171825.1603588354.1603808051.1612839506.3; __utmc=30149280; __utmb=223695111.0.10.1612839506; __utma=223695111.788421403.1612839506.1612839506.1612839506.1; __utmz=223695111.1612839506.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=223695111; ap_v=0,6.0; __utmt=1; dbcl2="165593539:LvLaPIrgug0"; ck=ZbYm; push_noty_num=0; push_doumail_num=0; __utmv=30149280.16559; __utmb=30149280.6.10.1612839506; _pk_id.100001.4cf6=e2e8bde436a03ad7.1612839506.1.1612842801.1612839506.',
'accept': 'image/avif,image/webp,image/apng,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'upgrade-insecure-requests': '1',
#'referer':'',
}
url = "https://movie.douban.com/subject/24733428/reviews?start=0"
r = requests.get(url, headers=headers)

上面是基本的爬虫代码,在requests里面设置headers(包含cookie),如果没有反爬机制的话,可以正常爬取数据。

但是 『豆瓣』 网站有反爬机制!!

rIbU7rZ.png!mobile

爬取就10几页之后,就出现这个验证!!

更关键的是: 验证之后接着爬取,几秒后又出现这个,即使设置几秒爬取一次也无法解决!

03

解决方案

方案猜想

根据多年的爬虫经验,首先想到的是设置IP代理,这样就相当于不同用户在爬取网站,因此就通过ip代理去尝试,看看能否解决 『豆瓣』 的反爬机制。

获取大量IP代理

如果单纯设置一个IP代理,那样跟咱们之前在自己电脑上爬取没有什么区别,因此需要 大量的IP代理 ,通过 随机抽取 的方式去使用IP代理,这样可以避免同一IP去爬取被 『豆瓣』 反爬机制禁爬。

IP代理正常来说,很贵,作为白嫖党,这里使用免费ip代理( 亲测可用

白嫖过程

https://h.shenlongip.com/index/index.html

白嫖的IP代理平台是:神龙Http,(这里不是广告,只是觉得可以白嫖,跟大家分享)

2qqmymy.png!mobile

注册之后,可以免费获取1000个IP代理( 详细过程就不介绍了,重点如何使用IP代理解决反爬问题~

67FNvub.png!mobile

这样我们就可以将提取的IP代理放到文本文件中。

设置IP代理

读取IP代理

iplist=[]
with open("ip代理.txt") as f:
iplist = f.readlines()

刚刚已经将ip全部保存到文本文件中,现在读取出来放到iplist中

随机抽取IP代理

#获取ip代理
def getip():
proxy= iplist[random.randint(0,len(iplist)-1)]
proxy = proxy.replace("\n","")
proxies={
'http':'http://'+str(proxy),
#'https':'https://'+str(proxy),
}
return proxies

通过 random 函数,可以在 iplist 代理集合中,随机抽取IP代理,并封装成 proxies 格式(requests的ip代理规定格式)

注解: 这里 https 被注释掉了,因为我这里的ip代理是http,所以有https的话则报错!

IP代理代码

headers = {
'Host':'movie.douban.com',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'cookie':'bid=uVCOdCZRTrM; douban-fav-remind=1; __utmz=30149280.1603808051.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __gads=ID=7ca757265e2366c5-22ded2176ac40059:T=1603808052:RT=1603808052:S=ALNI_MYZsGZJ8XXb1oU4zxzpMzGdK61LFA; _pk_ses.100001.4cf6=*; __utma=30149280.1867171825.1603588354.1603808051.1612839506.3; __utmc=30149280; __utmb=223695111.0.10.1612839506; __utma=223695111.788421403.1612839506.1612839506.1612839506.1; __utmz=223695111.1612839506.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=223695111; ap_v=0,6.0; __utmt=1; dbcl2="165593539:LvLaPIrgug0"; ck=ZbYm; push_noty_num=0; push_doumail_num=0; __utmv=30149280.16559; __utmb=30149280.6.10.1612839506; _pk_id.100001.4cf6=e2e8bde436a03ad7.1612839506.1.1612842801.1612839506.',
'accept': 'image/avif,image/webp,image/apng,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'upgrade-insecure-requests': '1',
#'referer':'',
}
url = "https://movie.douban.com/subject/24733428/reviews?start=0"
r = requests.get(url, proxies=getip(), headers=headers, verify=False)

eANvuae.png!mobile

加了IP代理之后,爬取了几百页也没有遇到过 验证问题。 轻松爬取 万级别 的数据没问题。

Fzeea23.png!mobile

已经爬取了8677条数据,一直没有验证出现,程序还在继续运行~~~

时间间隔

如果还是遇到验证机制,可以添加时间间隔,在爬取每一页的时候,先让 程序暂停几秒 (自定义)

time.sleep(random.randint(3,5))

random.randint(3,5) 是随机生成3~5之间的数字,因此程序在爬取一次后就随机暂停3~5秒。这样也是一个有效 防止触发反爬机制。

04

总结

  1. 讲解了通过 IP代理 时间间隔 去解决反爬验证问题

  2. 白嫖 可用的IP代理

  3. 爬取好的数据将会进一步 分析和挖掘 ,本文就讲解如何 解决爬虫的反爬问题 (毕竟大家时间宝贵,都是碎片化阅读,一下子太多内容难易消化)。

近期文章

Python网络爬虫与文本数据分析   

网络直播 | Python网络爬虫与文本分析

bsite库 | 采集B站视频信息、评论数据

爬虫实战 | 采集&可视化知乎问题的回答

pdf2docx库 | 转文件格式,支持抽取文件中的表格数据

rpy2库 | 在jupyter中调用R语言代码

tidytext | 耳目一新的R-style文本分析库

reticulate包 | 在Rmarkdown中调用Python代码

plydata库 | 数据操作管道操作符>>

七夕礼物 | 全网最火的钉子绕线图制作教程

读完本文你就了解什么是文本分析

文本分析在经管领域中的应用概述

综述:文本分析在市场营销研究中的应用

plotnine: Python版的ggplot2作图库

小案例: Pandas的apply方法   

stylecloud:简洁易用的词云库  

用Python绘制近20年地方财政收入变迁史视频   

Wow~70G上市公司定期报告数据集

漂亮~pandas可以无缝衔接Bokeh

YelpDaset: 酒店管理类数据集10+G

分享 ”和“ 在看 ”是更好的支持!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK