豆瓣网一般是新手容易上手的爬虫网站,并不是因为它反爬机制做的不够好,而是因为它采取了内容开放的运营策略,愿意分享给我们它的数据。
以前是很容易爬取豆瓣网的电影信息,最近可能是豆瓣网升级了反爬机制,直接请求数据会发生urllib.error.HTTPError: HTTP Error 403/418的错误
#!/usr/bin/env python
# coding:utf8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#urllib2包提供了和HTTP请求相关的函数
import urllib
import urllib2
import json
from bs4 import BeautifulSoup
tags = []
url = 'https://movie.douban.com/j/search_tags?type=tv&source=index'
request = urllib2.Request(url=url)
response = urllib2.urlopen(request, timeout=20)
result = response.read()
print result
1.打开Chrome的开发者工具,找到异步请求,在Header中找到我们当前请求的浏览器
2.复制User-Agent
信息
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
3.加入Headers,就可以完成爬虫了
#!/usr/bin/env python
# coding:utf8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#urllib2包提供了和HTTP请求相关的函数
import urllib
import urllib2
import json
from bs4 import BeautifulSoup
tags = []
url = 'https://movie.douban.com/j/search_tags?type=tv&source=index'
#伪装成浏览器进行爬虫,现在豆瓣电影网开启了反爬虫策略
headers = {
'User-Agent': 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'}
request = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(request, timeout=20)
result = response.read()
print result
当然,我们也可以随机获取User-Agent
,建立一个list,保存所有浏览器信息
#!/usr/bin/env python
# coding:utf8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#urllib2包提供了和HTTP请求相关的函数
import urllib
import urllib2
import json
from bs4 import BeautifulSoup
import random
agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
]
#随机获取agent_list里面的一条信息
user_agent = random.choice(agent_list)
tags = []
url = 'https://movie.douban.com/j/search_tags?type=tv&source=index'
headers = {
'User-Agent': user_agent}
request = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(request, timeout=20)
result = response.read()
print result
以上介绍的两种方法都是最基础的爬取方法和解决方案,所针对的也是采取开放运营态度,或者暂未采取反爬机制的网站,方法虽简单,但对相当多数的网站仍然是适用的。
爬虫和反爬虫之间就像矛与盾的关系,我们可以花更过的心思、时间和成本去爬取数据,数据运营商同样可以花更多的技术、金钱和人力以保护数据。有以下几种情况:
1.运营商识别代码请求并禁止
解决方案:
伪装成浏览器
2.运营商对IP频繁请求采取限制
解决方案:
使用IP代理池
3.运营方要求登陆并输入复杂验证码
解决方案:
研究验证码规则模拟登录,搭建和使用大规模分布式爬虫