不适合没有爬虫基础的,自己写着玩玩,其中的IP地址,也是爬取下来的,实时在变
注意:没有对IP地址进行校验
爬取豆瓣电影,豆瓣电影现在都有反爬虫机制,我们采用2种方法:
- 不同浏览器标识:User_agent(模拟不同的浏览器)
- 不同的IP地址:proxies(防止IP地址被封)
- 爬取间隔2秒:防止网页扫描频繁操作
import pandas as pd import requests from bs4 import BeautifulSoup import random import time随机生产浏览器标识user-agent
#随机生成User_agent,浏览器标识
def get_ua():
first_num = random.randint(55, 76)
third_num = random.randint(0, 3800)
fourth_num = random.randint(0, 140)
os_type = [
'(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)',
'(Macintosh; Intel Mac OS X 10_14_5)'
]
chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)
ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36',
'(KHTML, like Gecko)', chrome_version, 'Safari/537.36']
)
return ua
获取快代理的免费高密IP,第一页
def get_ipinfo(soup,str_craw,key,value):
a=soup.find(str_craw,attrs={key:value}).text
return a
#获取快代理免费的高密IP
#抓取快代理第一页:类型,IP地址,
ip_info=[]
for i in range(2,3):#前1页
url=r"https://www.kuaidaili.com/free/inha/{}".format(i)
headers = {
'User-Agent':get_ua()
}
res=requests.get(url=url,headers=headers)
soup=BeautifulSoup(res.text,'lxml')
link_table=soup.find('tbody')
for tr_data in link_table.find_all('tr'):
dic={}
ip=str(get_ipinfo(tr_data,'td','data-title','IP'))
http=str(get_ipinfo(tr_data,'td','data-title','类型'))
dic[http]=ip
ip_info.append(dic)
len(ip_info)
准备工作完成,开始进行爬取操作
先爬取电影链接
#获取所有的电影链接
movie_href=[]
for num in range(0,250,25):
url='https://movie.douban.com/top250?'
headers = {'User-Agent':get_ua()}
proxy=random.choice(ip_info)
params={
'start':num
}
res=requests.get(url=url,headers=headers,params=params,proxies=proxy)
soup=BeautifulSoup(res.text,'lxml')
link_list=soup.find_all('div',attrs={'class':"hd"})
for link in link_list:
href_link=link.find('a').attrs['href']
movie_href.append(href_link)
print(len(movie_href))
自定义一个爬取过程中的函数
def multi_craw(data,str_craw,key,value):
#新列表存储数据
num_list=[]
for num in data.find_all(str_craw,attrs={key:value}):
num_list.append(num.text)
return '/'.join(num_list)
开始爬取
每部电影之间实现2s的延时,总耗时12min左右
#对所有的电影链接分别获取信息
#电影名称,导演,主演,豆瓣评分,评价人数,类型,制片国家/地区,语言,上映日期,片长,IMDb
#获取的信息全部存在列表中
movie_info_sum=[]
i=0
for movie in movie_href:
time.sleep(2)
#每部电影的信息存在字典中
dic={}
headers = {'User-Agent':get_ua()}
proxy=random.choice(ip_info)
movie_res=requests.get(url=movie,headers=headers,proxies=proxy)
movie_soup=BeautifulSoup(movie_res.text,'lxml')
#电影名称
dic['电影名称']=movie_soup.find('span',attrs={'property':"v:itemreviewed"}).text
#导演
dic['导演']=movie_soup.find('a',attrs={'rel':"v:directedBy"}).text
#主演
dic['主演']=multi_craw(movie_soup,'a','rel',"v:starring")
#豆瓣评分
dic['豆瓣评分']=movie_soup.find('strong',property="v:average").text
#评价人数
dic['评价人数']=movie_soup.find('span',property="v:votes").text
#类型
dic['类型']=multi_craw(movie_soup,'span','property',"v:genre")
#制片国家/地区
dic['制片国家/地区']=movie_soup.find('span',text='制片国家/地区:').next_sibling
#语言
dic['语言']=movie_soup.find('span',text='语言:').next_sibling
#上映日期
dic['上映日期']=multi_craw(movie_soup,'span','property',"v:initialReleaseDate")
#片长
dic['片长']=movie_soup.find('span',property="v:runtime").text
#IMDb
dic['IMDb']=movie_soup.find('span',text='IMDb:').next_sibling
#一部电影信息爬取完成后,存在列表中,爬取下一步电影信息
movie_info_sum.append(dic)
i+=1
print('{}{}{}'.format('爬取第',i,'部电影成功'))
爬取到的数据使用pandas读成Dataframe形式,并保存为csv文件
data=pd.Dataframe(movie_info_sum) data.to_csv(r'C:Users26053Desktop论文Pythongithubtest爬取豆瓣电影TOP250信息数据.csv') data.head()



