上一篇爬虫写了如何应付反爬的一些策略也简单的举了根据UA的例子,今天写一篇如何根据不同IP进行访问豆瓣网获取排行版
requests添加IP代理
如果使用代理的话可以通过requests中的方法proxies
def request(method, url, **kwargs): """Constructs and sends a :class:`Request <Request>`. :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. 太多了,删除了一些留下了主要
会有人问,这么多代理去哪里找?小编百度了找了一些发现西刺代理挺好用的。
随便从里面找1个进行发请求
# coding:utf-8 import requests url ="http://httpbin.org/get" proxy = '117.191.11.73:80' proxies = { 'http':'http://'+proxy, 'https':'https://'+ proxy } r =requests.get(url,proxies=proxies) print(r.text) 代码结果: { "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.21.0", "X-Via": "Cache-363" }, "origin": "117.191.11.73, 117.191.11.73", "url": "https://httpbin.org/get" }
通过代理抓取豆瓣网
1.通过requests请求地址:https://movie.douban.com/top250
2.添加代理IP
3.通过Beautiful Soup获取Html页面
4.进行分析Html页面,完成对导演,电影名称,评分的抓取
代码结果:
import requests from bs4 import BeautifulSoup import re # 请求头 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit' '/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400' } # 添加代理 proxies = { 'http':'http://113.121.22.92:808',} r = requests.get(url,headers=headers,proxies=proxies) html = r.content.decode('utf-8') blog = BeautifulSoup(html,'html.parser') daoyan = blog.find_all('p',class_='') # 导演 titles = blog.find_all('div',class_='hd') # 电影名称 pingfen = blog.find_all('span',class_='rating_num') # 评分 for title,daoya, pingfe in zip(titles,daoyan,pingfen): m = title.get_text().split(' ')[2] x = daoya.get_text().strip() x1 = re.findall(r'导演: (.*?)xa0',x) cc = pingfe.get_text() print(m) print(x1) print(cc)
代码执行完后发现只抓取了第一页的数据,而我们想要的时候全部数据,那么我们就继续分析URL路径
# 第一页的URL地址 https://movie.douban.com/top250 # 第二页的URL地址 https://movie.douban.com/top250?start=25&filter= # 第三页的URL地址 https://movie.douban.com/top250?start=50&filter=
经过观察我们可以发现后面唯一变得数据就是start,那么我们可以通过拼接URL获取全部数据,并且把这么数据写入到TXT文件中
import requests from bs4 import BeautifulSoup import re page = 0 base_url = 'https://movie.douban.com/top250?start=' # 通过循环拼接URL while page<10: url = base_url + str(25*page) page += 1 # 请求头 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'/Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400' } # IP代理 proxies = { 'http':'http://113.121.22.92:808',} r = requests.get(url,headers=headers,proxies=proxies) html = r.content.decode('utf-8') blog = BeautifulSoup(html,'html.parser') daoyan = blog.find_all('p',class_='') # 导演 titles = blog.find_all('div',class_='hd') # 电影名称 pingfen = blog.find_all('span',class_='rating_num') # 评分 for title,daoya, pingfe in zip(titles,daoyan,pingfen): m = title.get_text().split(' ')[2] x = daoya.get_text().strip() x1 = re.findall(r'导演: (.*?)xa0',x) cc = pingfe.get_text() # 写入到txt文件中 with open('123.txt','a+',encoding='utf-8')as f : f.write('{m} {x1} {cc} '.format(m=m,x1=x1,cc=cc))
通过查看TXT文件,发现已经成功的获取到了豆瓣网的电影信息。
这个案例只是简单的表达我们可以通过IP代理的方式进行来完成爬虫(当然不用代理一样可以请求成功,只是简单的表达下思想,思想学会了,其他的都是简单的问题了)
以后我们如果遇到了封IP的网站都可以通过添加IP代理的方式进行爬取数据;
如果感觉安静写的内容对你有帮助,请点击个关注,内容持续更新中~~~~~