豆瓣网一般是新手容易上手的爬虫网站,并不是因为它反爬机制做的不够好,而是因为它采取了内容开放的运营策略,愿意分享给我们它的数据。

以前是很容易爬取豆瓣网的电影信息,最近可能是豆瓣网升级了反爬机制,直接请求数据会发生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中找到我们当前请求的浏览器
Chrome开发者工具

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.运营方要求登陆并输入复杂验证码
解决方案:
研究验证码规则模拟登录,搭建和使用大规模分布式爬虫

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐