python代理爬蟲抓豆瓣電影數據

寫爬蟲防止被封的關鍵有以下幾點:

  1. 偽裝請求報頭(request header)
  2. 減輕訪問頻率,速度
  3. 使用代理IP

一般第一點都能做到,第二點減輕訪問頻率就會大大增加任務時間,而使用代理就能在不增加任務時長避免被封的關鍵(實際情況卻是任務時間因為代理的使用而增加的,但這裡不細說,知道就好)。

下面我們從 國內高匿代理IP 獲得代理IP數據。

import osnimport timenimport requestsnfrom bs4 import BeautifulSoupnn#num獲取num頁 國內高匿ip的網頁中代理數據ndef fetch_proxy(num):n #修改當前工作文件夾n os.chdir(r/Users/apple888/PycharmProjects/proxy IP)n api = http://www.xicidaili.com/nn/{}n header = {n User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/n 537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36}n fp = open(host.txt, a+, encoding=(utf-8))n for i in range(num+1):n api = api.format(1)n respones = requests.get(url=api, headers=header)n soup = BeautifulSoup(respones.text, lxml)n container = soup.find_all(name=tr,attrs={class:odd})n for tag in container:n try:n con_soup = BeautifulSoup(str(tag),lxml)n td_list = con_soup.find_all(td)n ip = str(td_list[1])[4:-5]n port = str(td_list[2])[4:-5]n IPport = ip + t + port + nn fp.write(IPport)n except Exception as e:n print(No IP!)n time.sleep(1)n fp.close()n

我們準備抓 國內高匿代理IP網 的十個頁面的代理

fetch_proxy(10)n

但是有代理IP還不行,因為我們不知道這代理能不能用,是否有效。

下面我們用百度網進行檢驗(大公司不怕咱們短時間內高頻率訪問),上代碼:

import osnimport timenimport requestsnfrom bs4 import BeautifulSoupndef test_proxy():n N = 1n os.chdir(r/Users/apple888/PycharmProjects/proxy IP)n url = https://www.baidu.comn fp = open(host.txt, r)n ips = fp.readlines()n proxys = list()n for p in ips:n ip = p.strip(n).split(t)n proxy = http: + ip[0] + : + ip[1]n proxies = {proxy: proxy}n proxys.append(proxies)n for pro in proxys:n try:n s = requests.get(url, proxies=pro)n print(第{}個ip:{} 狀態{}.format(N,pro,s.status_code))n except Exception as e:n print(e)n N+=1n

運行該代碼,效果如下

代理Ip池生成函數

#生成代理池子,num為代理池容量ndef proxypool(num):n n = 1n os.chdir(r/Users/apple888/PycharmProjects/proxy IP)n fp = open(host.txt, r)n proxys = list()n ips = fp.readlines()n while n<num:n for p in ips:n ip = p.strip(n).split(t)n proxy = http: + ip[0] + : + ip[1]n proxies = {proxy: proxy}n proxys.append(proxies)n n+=1n return proxysn

下面開始爬豆瓣電影的電影數據,我們要獲取 電影名、演員、評分。現在只抓爛片

開始上代碼

def fetch_movies(tag, pages, proxys):n os.chdir(r/Users/apple888/PycharmProjects/proxy IP/豆瓣電影)n url = https://movie.douban.com/tag/愛情?start={}n headers = {n User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/n 537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36}nn #用csv文件保存數據n csvFile = open("{}.csv".format(tag), a+, newline=, encoding=utf-8)n writer = csv.writer(csvFile)n writer.writerow((name, score, peoples, date, nation, actor))nn for page in range(0, pages*(20+1), 20):n url = url.format(tag, page)n try:n respones = requests.get(url, headers=headers, proxies=random.choice(proxys))n while respones.status_code!=200:n respones = requests.get(url, headers=headers, proxies=random.choice(proxys))n soup = BeautifulSoup(respones.text, lxml)n movies = soup.find_all(name=div, attrs={class: pl2})n for movie in movies:n movie = BeautifulSoup(str(movie), lxml)n movname = movie.find(name=a)n # 影片名n movname = movname.contents[0].replace( , ).strip(n).strip(/).strip(n)n movInfo = movie.find(name=p).contents[0].split(/)n # 上映日期n date = movInfo[0][0:10]n # 國家n nation = movInfo[0][11:-2]n actor_list = [act.strip( ).replace(..., ) for act in movInfo[1:-1]]n # 演員n actors = t.join(actor_list)n # 評分n score = movie.find(span, {class: rating_nums}).stringn # 評論人數n peopleNum = movie.find(span, {class: pl}).string[1:-4]n writer.writerow((movname, score, peopleNum, date, nation, actors))n except:n continuen print(共有{}頁,已爬{}頁.format(pages, int((page/20))))n

執行上述寫好的代碼

import timenstart = time.time()nproxyPool= proxypool(50)nfetch_movies(爛片, 111, proxyPool)nend = time.time()nlastT = int(end-start)nprint(耗時{}s.format(lastT))n

後續文章我會寫點對豆瓣電影數據的分析(會使用pandas庫)

-------------------------------------

作者:鄧旭東

博客專欄:鄧旭東HIT的博客專欄

公眾號: 文科生也能玩轉python

簡書: 鄧旭東HIT

知乎 :鄧旭東HIT

大家也可以加小編微信:tszhihu (備註:Python),拉大家到 Python愛好者社區 微信群,可以跟各位老師互相交流。謝謝。第一時間獲取視頻更新動態。

也可以關注官方微信公眾號:Python愛好者社區

免費活動友情提醒: 3月16號崔慶才老師視頻直播分享:爬取知乎所有用戶詳細信息 爬取知乎所有用戶詳細信息 (1. 分析知乎Ajax請求及爬取邏輯 2. 用Scrapy實現遞歸爬取 3. 爬取結果存儲到MongoDB ) 歡迎報名參與!!!


推薦閱讀:

豆瓣評分9.0的國產網劇《白夜追兇》火爆背後,我們應該了解些什麼?
每一次改版,都是向死而生
城市落幕的味道是大排檔
打造紅人經濟,曾不食煙火的豆瓣今天距離錢越來越近

TAG:Python | 豆瓣 | 代理 |